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

軟工

48220


推文有個連結有解答我的疑惑

感謝bron大

文章有點長

先說說我對依賴注入的理解

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://www.ptt.cc/bbs/Soft_Job/M.1648731970.A.382.html
Keade03251樓當有需要抽換實作的時候 03/31 21:27
MoonCode2樓在你理解前應該先完全不靠 spring 的功能,只靠 java 03/31 21:29
MoonCode3樓本身來做依賴注入,然後判斷有沒有真的有效就是你的類 03/31 21:29
MoonCode4樓可以把依賴的東西改用mock替換。那等你都弄好後開始不 03/31 21:29
MoonCode5樓斷的堆積業務邏輯時,就會發現初始化的地方會有一堆 n 03/31 21:29
MoonCode6樓ew constructor 然後再傳進另一個 new constructor,那 03/31 21:29
MoonCode7樓這時候一個像 spring 這樣的框架就可以用各種方式來幫 03/31 21:29
MoonCode8樓助你避免自己寫這些 new,就可以避免一些麻煩。 但我是 03/31 21:29
MoonCode9樓喜歡自己手動操作啦,靠框架的話整個生命周期很難看懂 03/31 21:29
MoonCode10樓 03/31 21:29
wulouise11樓我覺得任何DI framework都跟singleton 87%像邪惡 03/31 21:33
illya6553612樓個人覺得方便測試時去 mock,平常用 Laravel 的經驗 03/31 21:35
bheegrl13樓Polymorphism 03/31 21:39
bheegrl14樓通常是autowired interface啦,再依參數配置決定要使用 03/31 21:42
Keade032515樓簡單的例子就是更換DB driver 03/31 21:43
bheegrl16樓哪個實作上面那interface的component 03/31 21:44
bronx080717樓@Autowired只是依類名或型別幫你在Spring容器生物件 03/31 22:00
bronx080718樓DI與IoC才是低耦合的關鍵,與@Autowired無關 03/31 22:01
本人19樓可是如果DI要我自己寫的話,Spring幫我做了啥,單純 03/31 22:03
本人20樓的控制反轉有降低耦合嗎? 03/31 22:03
bronx080721樓Spring幫你new物件並注入到使用的對象屬性中 03/31 22:04
bronx080722樓還有上面Dao1 Dao2例子有誤,DI是從外面set進來 03/31 22:05
本人23樓我的第一個例子應該是DI吧,把ADDRESS注入到Employee 03/31 22:07
本人24樓當中 03/31 22:07
本人25樓即使用Spring,不用自己寫new,可是建構子還是要自己寫 03/31 22:08
本人26樓阿,降低了什麼功夫呢 03/31 22:08
bronx080727樓幫你搞定層層的依賴關係 03/31 22:10
bronx080728樓你可以試試不用Spring自己寫依賴注入,你就知道差異 03/31 22:10
本人29樓我第一個例子就沒有依賴Spring 阿 地址跟員工那個 03/31 22:13
foreverk30樓spring就是做掉你自己舉的例子,不然誰要往兩個class傳 03/31 22:16
更多請益
[請益] offer 精誠 奕兆 IBM 宏碁資訊 瑪黑家居
[請益] 能「代收代轉付」的第三方支付?
[請益] 轉職問題(代發)
[請益] offer 請益 Qnap 鴻璟
[請益] OFFER請益
[請益] 工作半年對未來規劃的疑問(文稍長)
[請益] offer 請益 IBM vs 研華
[請益] 網頁後端工程師轉區塊鏈工程師