Fw: [請益] Spring boot的依賴注入降低耦合的例子

作者: ntpuisbest (阿龍)   2022-03-31 22:12:12
※ [本文轉錄自 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
作者: Keade0325 (pinpin)   2021-03-31 21:27:00
當有需要抽換實作的時候
作者: MoonCode (MoonCode)   2021-03-31 21:29:00
在你理解前應該先完全不靠 spring 的功能,只靠 java本身來做依賴注入,然後判斷有沒有真的有效就是你的類可以把依賴的東西改用mock替換。那等你都弄好後開始不斷的堆積業務邏輯時,就會發現初始化的地方會有一堆 new constructor 然後再傳進另一個 new constructor,那這時候一個像 spring 這樣的框架就可以用各種方式來幫助你避免自己寫這些 new,就可以避免一些麻煩。 但我是喜歡自己手動操作啦,靠框架的話整個生命周期很難看懂。
作者: wulouise (在線上!=在電腦前)   2021-03-31 21:33:00
我覺得任何DI framework都跟singleton 87%像邪惡
作者: illya65536 (illya65536)   2021-03-31 21:35:00
個人覺得方便測試時去 mock,平常用 Laravel 的經驗
作者: bheegrl   2021-03-31 21:39:00
Polymorphism通常是autowired interface啦,再依參數配置決定要使用
作者: Keade0325 (pinpin)   2021-03-31 21:43:00
簡單的例子就是更換DB driver
作者: bheegrl   2021-03-31 21:44:00
哪個實作上面那interface的component
作者: bronx0807 (堅持需要練習)   2021-03-31 22:00:00
@Autowired只是依類名或型別幫你在Spring容器生物件DI與IoC才是低耦合的關鍵,與@Autowired無關
作者: ntpuisbest (阿龍)   2021-03-31 22:03:00
可是如果DI要我自己寫的話,Spring幫我做了啥,單純的控制反轉有降低耦合嗎?
作者: bronx0807 (堅持需要練習)   2021-03-31 22:04:00
Spring幫你new物件並注入到使用的對象屬性中還有上面Dao1 Dao2例子有誤,DI是從外面set進來
作者: ntpuisbest (阿龍)   2021-03-31 22:07:00
我的第一個例子應該是DI吧,把ADDRESS注入到Employee當中即使用Spring,不用自己寫new,可是建構子還是要自己寫阿,降低了什麼功夫呢
作者: bronx0807 (堅持需要練習)   2021-03-31 22:10:00
幫你搞定層層的依賴關係你可以試試不用Spring自己寫依賴注入,你就知道差異
作者: ssccg (23)   2022-04-01 10:17:00
field宣告可以用interface,不用實際的class,才有降低耦合通常實際class並沒有降低耦合,只是省掉自己初始化整個物件結構的工(spring bean預設的scope是application scope,也就是整個ApplicationContext裡只會new一次,在有很多bean的app裡面要達到一樣的效果要多寫很多程式碼,可不只是在宣告處new就好),等哪天真的有需要降低耦合,用refactor工具把interface抽出就好
作者: ntpuisbest (阿龍)   2022-04-02 17:41:00
TY FOR JAVA AND SOFTJOB

Links booklink

Contact Us: admin [ a t ] ucptt.com