PTT推薦

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

看板Soft_Job標題Re: [請益] Spring boot的依賴注入降低耦合的例子作者
lovdkkkk
(dk)
時間推噓 2 推:2 噓:0 →:0

來補一下 "如何驗證效果" 的部份

首先假設情境, A 是你的 Web App
B 是那個要被 Spring 注入的東西, 假設在 "外部" "其它人開發的 jar" 裡面

驗證的項目

1. B "改變" 時, A 需要做哪些事?
ex: B 的 package 名改了,
A 要?
1-1. 什麼都不用做只要改 springboot config,
1-2. 要改 code,
1-3. 要重新 build

2. 要將 A 中的 B 替換成 C/D/E 時, 需要做哪些事?
2-1. 什麼都不用做只要改 springboot config,
2-2. 要改主程式裡的 import 並重 build
2-3. 要改很多檔案裡的 import 敘述並重 build
2-4. 甚至還要改一卡車方法名, 連帶的傳入參數類型, etc

然後想想看, 假如 A 是你在維護, 然後發生第 1 點的狀況
或者 A 是你買來的系統, 然後你想做第 2 點的事情如換個資料庫、換個連線 lib
或者你想在 B 沒完工確定前先寫測試測 A 的流程跟邏輯
是能自己很容易做到, 還是得請原開發者幫忙甚至再重出一版

把各種做法, 包括
直接依賴實體、A/B 都依賴於 A 中所定義的介面、
使用 Spring 注入, 在主程式自己 new 自己塞等等,
通通用上面幾項確認一下, 大概就知道效果在哪了

--

很久沒寫 Java 插個花科科

※ 引述《ntpuisbest (阿龍)》之銘言:
: 推文有個連結有解答我的疑惑
: 感謝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留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.200.216 (臺灣)
PTT 網址

yupog200304/02 08:53這篇對我來說很好懂

s06yji304/03 10:44thanks