java 板


LINE

※ [本文轉錄自 Soft_Job 看板 #1YHQT2E2 ] 作者: ntpuisbest (阿龍) 看板: Soft_Job 標題: [請益] Spring boot的依賴注入降低耦合的例子 時間: Thu Mar 31 21:06:08 2022 文章有點長 先說說我對依賴注入的理解 Spring boot 依賴注入大致有三種方式 透過建構子的 透過setter的 或是 field 這三種都可以透過@Autowired註解來達到依賴注入的效果 我自己想到的建構子的舉例是 假設有兩個類 Address 和 Employee好了 1. public class Address { String Country; String City; String Street; public Address(String country, String city, String street) { Country = country; City = city; Street = street; } } 2. public class Employee { String sex; String name; Address address; // 沒有依賴注入的方式 public Employee(String Country,String City,String Street,String sex, String name ) { this.sex=sex; this.address = new Address( Country, City,Street ); this.name=name; } // 有依賴注入的方式 public Employee(String sex, String name, Address address) { this.sex = sex; this.name = name; this.address = address; } } 在上面的例子當中可以發現,如果哪一天 Address這個類新增了一個屬性叫 phoneNumber好了 沒有依賴注入的方式,必須要更改 Employee 的 this.address =new Address(Country,City,Street,phoneNumber) 而有依賴注入的方式確實降低了耦合 因為他不用更改Employee的建構方式 所以我理解依賴注入可以降低耦合 所以我理解依賴注入可以降低耦合 所以我理解依賴注入可以降低耦合 但我的問題是Spring boot 的 autowird annotation 有幫助我們降低耦合嗎 在常見的開發中 我們經常都會有 Dao 以及 Service 假設我有兩個 Dao 好了 分別是 Dao1 和 Dao2 以及一個Service Dao1 public class Dao { public void sayhi() { System.out.println("hello"); } } Dao1 public class Dao { public void sayhi() { System.out.println("hello"); } } Dao2 public class Dao2 { public void saygoodbye() { System.out.println("say goodbye"); } } 如果我不在service上面使用autowired 我的service會是 public class Service { Dao1 dao=new Dao1(); Dao2 dao2=new Dao2(); public void sayhi() { dao.sayhi(); } public void saygoodbye() { dao2.saygoodbye(); } } 如果我使用了@Autowired註解 那我只是將 Dao1 dao=new Dao1(); Dao2 dao2=new Dao2(); 替換成 @Autowired Dao1 dao @Autowired Dao2 dao2 我想請問所以我使用了Autowired註解 我知道我可以不需要使用new 來建構實體 但 Spring 真的有幫我降低耦合嗎 即使我換成 setter 配合 autowired的方式好了 那個 setter也是要我自己去撰寫 Spring 幫我降低了耦合甚麼? 我的問題簡單來說就是 我知道依賴注入可以降低耦合 但Spring boot透過 @Autowired註解幫我降低耦合在哪 謝謝 p.s 因為面試的時候常常被面試官問說懂不懂甚麼是 控制反轉還有DI,我基本上舉例都舉 Address還有 Employee的例子 但當我反問下面例子的時候,他們好像也說要再回去想一下... 只有其中一個就說更複雜的例子會用到,但也沒說甚麼是更複雜的例子QQ --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.167.157.11 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1648731970.A.382.html ※ 編輯: ntpuisbest (49.216.186.239 臺灣), 03/31/2022 21:14:38
1F:推 Keade0325: 當有需要抽換實作的時候 03/31 21:27
2F:推 MoonCode: 在你理解前應該先完全不靠 spring 的功能,只靠 java 03/31 21:29
3F:→ MoonCode: 本身來做依賴注入,然後判斷有沒有真的有效就是你的類 03/31 21:29
4F:→ MoonCode: 可以把依賴的東西改用mock替換。那等你都弄好後開始不 03/31 21:29
5F:→ MoonCode: 斷的堆積業務邏輯時,就會發現初始化的地方會有一堆 n 03/31 21:29
6F:→ MoonCode: ew constructor 然後再傳進另一個 new constructor,那 03/31 21:29
7F:→ MoonCode: 這時候一個像 spring 這樣的框架就可以用各種方式來幫 03/31 21:29
8F:→ MoonCode: 助你避免自己寫這些 new,就可以避免一些麻煩。 但我是 03/31 21:29
9F:→ MoonCode: 喜歡自己手動操作啦,靠框架的話整個生命周期很難看懂 03/31 21:29
10F:→ MoonCode: 。 03/31 21:29
11F:推 wulouise: 我覺得任何DI framework都跟singleton 87%像邪惡 03/31 21:33
12F:推 illya65536: 個人覺得方便測試時去 mock,平常用 Laravel 的經驗 03/31 21:35
13F:→ bheegrl: Polymorphism 03/31 21:39
14F:→ bheegrl: 通常是autowired interface啦,再依參數配置決定要使用 03/31 21:42
15F:推 Keade0325: 簡單的例子就是更換DB driver 03/31 21:43
16F:→ bheegrl: 哪個實作上面那interface的component 03/31 21:44
17F:→ bronx0807: @Autowired只是依類名或型別幫你在Spring容器生物件 03/31 22:00
18F:→ bronx0807: DI與IoC才是低耦合的關鍵,與@Autowired無關 03/31 22:01
19F:→ ntpuisbest: 可是如果DI要我自己寫的話,Spring幫我做了啥,單純 03/31 22:03
20F:→ ntpuisbest: 的控制反轉有降低耦合嗎? 03/31 22:03
21F:推 bronx0807: Spring幫你new物件並注入到使用的對象屬性中 03/31 22:04
22F:→ bronx0807: 還有上面Dao1 Dao2例子有誤,DI是從外面set進來 03/31 22:05
23F:→ ntpuisbest: 我的第一個例子應該是DI吧,把ADDRESS注入到Employee 03/31 22:07
24F:→ ntpuisbest: 當中 03/31 22:07
25F:→ ntpuisbest: 即使用Spring,不用自己寫new,可是建構子還是要自己寫 03/31 22:08
26F:→ ntpuisbest: 阿,降低了什麼功夫呢 03/31 22:08
27F:→ bronx0807: 幫你搞定層層的依賴關係 03/31 22:10
28F:→ bronx0807: 你可以試試不用Spring自己寫依賴注入,你就知道差異 03/31 22:10



※ 發信站: 批踢踢實業坊(ptt.cc)
※ 轉錄者: ntpuisbest (118.167.157.11 臺灣), 03/31/2022 22:12:12
29F:→ ssccg: field宣告可以用interface,不用實際的class,才有降低耦合 04/01 10:17
30F:→ ssccg: 通常實際class並沒有降低耦合,只是省掉自己初始化整個物件 04/01 10:18
31F:→ ssccg: 結構的工(spring bean預設的scope是application scope,也 04/01 10:19
32F:→ ssccg: 就是整個ApplicationContext裡只會new一次,在有很多bean的 04/01 10:20
33F:→ ssccg: app裡面要達到一樣的效果要多寫很多程式碼,可不只是在宣告 04/01 10:21
34F:→ ssccg: 處new就好),等哪天真的有需要降低耦合,用refactor工具 04/01 10:22
35F:→ ssccg: 把interface抽出就好 04/01 10:23
36F:→ ntpuisbest: TY FOR JAVA AND SOFTJOB 04/02 17:41







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP