Re: [請益] Spring boot的依賴注入降低耦合的例子
來補一下 "如何驗證效果" 的部份
首先假設情境, 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
--
20
在這個時代依賴注入最重要的用途,特別是在後端開發是讓Application 在多個不同的 環境下(Development, Production, local, etc) 能夠根據profile 組出能正確執行的Application 多型在這裡當然有他的地位,但是一般來說,大部分不接觸system boundary的service objects 是不太需要多型的,如果是java,那種一個interface 只有一個implementation10
很久沒寫Java了 就個人觀念提供簡單思考線索 基本上根據你的內容覺得你對解耦合還沒有很理解 講直白一點 當你import類別就是耦合了17
先講結論: DI(Dependency Injection) 跟 IoC(Inversion of Control) 的原始目的都不是解耦 接著說明一下 DI 跟 IoC: 首先 IoC 的目的是控制權的轉移,如原 PO 文章裡面原本是在 Employee 裡面 new Address,而採用 IoC 之後這樣的行為就轉移到外部來決定25
首Po推文有個連結有解答我的疑惑 感謝bron大 文章有點長 先說說我對依賴注入的理解 Spring boot
爆
[問卦] 70多歲老番癲一直問A答B如果公司有一個70多歲的高層 做得很爛整天一直出包 但開會被人質疑就開始亂扯 一直問A答B 油條的很 遇到這種人要怎麼辦啊?爆
[情報] 球員A跟球員B的數據對比Player A: Player B: 30.0 PPG 30.1 PPG 6.3 APG 6.1 APG 1.1 BPG 0.9 BPG 52.3 FG% 51.9 FG%爆
[心得] A醇抗老及早C晚A:2.寶拉A醇是否已讀取發文須知並詳閱版規(Y/N):Y 因為早C晚A的文章寫到有點開花 決定就分篇介紹,這篇先介紹寶拉A醇產品 下篇再繼續介紹其他A醇產品 寶拉A醇有三種濃度,分別覆蓋入門、進階、高級濃度22
[討論] 什麼情況下你接受「尾隨別人」這件事?抱歉標題下的好像很恐怖,因為想描述的完整一點所以有點落落長 昨天跟閃光看劇,背景是70年代連電話都不太普及的台灣 有一個劇情是 「 A與B是交往許久的情侶,B不知道A的住處。21
Re: [討論] 重構跟kpi的考量如果 A, B 都沒有任何 tests,建議不要動他。 幫 C 實做這個功能的時候,把 unit test 寫好寫滿,確保 C 是對的 行有餘力,針對 A, B 的使用情境也加上 test case,確保未來在 A, B 確實能重用 (這點很重要,否則很容易程式長得很像你以為可以重用,實際上根本不能) 就先做到這樣就好,確保 C 的品質,同時你獲得了高品質的 reusable 模組19
[心情] 不愉快的相親-媒人篇寫在前頭, 其實還是有很多不錯的媒人, 例如台中豐原的鍾阿姨(佛心善良)、 彰化員林的張阿姨。 她們都會幫忙過濾再介紹,