Re: [請益] Spring boot的依賴注入降低耦合的例子
先講結論:
DI(Dependency Injection) 跟 IoC(Inversion of Control) 的原始目的都不是解耦
接著說明一下 DI 跟 IoC:
首先 IoC 的目的是控制權的轉移,如原 PO 文章裡面原本是在 Employee 裡面 new
Address,而採用 IoC 之後這樣的行為就轉移到外部來決定
而之所以要轉移控制權是為了好維護,例如可能 new Address 的行為將來要調整就不用動到 Employee
而 DI 只是搭配 IoC 來將物件注入需要的物件當中,例如透過 Employee 的 Constructor
來注入 Address 的實例
在這兩個 pattern 當中都沒有要求轉移控制跟注入的物件是什麼,你要注入抽象或實作都可以,也因此並不能直接幫助你解耦
而且 Spring 只是提供 DI/IoC 相關功能來幫助管控物件生命週期,並且降低自己實作的複雜度,實際上你完全可以自己實作,例如在 main 自己寫注入
如果你的目的是要解耦的話,要考慮的應該是 SOLID 裡面的 DI(Dependency Inversion),利用抽象隔離實作
而且首先要說明的是一般軟體在說得解耦都是指對實作解耦,畢竟兩個元件要能協作,不可能兩邊都完全不知道對方,而知道 (know) 對方就是一種耦合
SOLID 的 DI 就是利用抽象幫助你解耦 (strong coupling to weak coupling)
而在有抽象隔離的前提下,利用 DI/IoC 就能幫助你大幅降低後續修改實作的時候,元件互相影響的可能性,並且方便測試,尤其是單元測試
接著利用 Spring 提供的 DI/IoC 功能可以更進一步減少實作的複雜度,讓 DI 實作的
boiler plate 部分交給 Spring 管理達到關注點分離的效果,讓你可以專注在邏輯面
以原 PO 的例子來說算是有用到 DI/IoC 的概念,但實務上以這個例子來說可能根本不需要用到 Spring 的功能,而比較需要考慮的是 Address 跟 Employee 要如何互動
比較常見的例子是 Spring MVC 分層架構下要在 Controller 層使用 Service 或 Service
層使用 Repository
尤其是 Spring Data JPA 常用的 CrudRepository 或 JpaRepository 原本就是
interface,你根本不需要知道 Spring 幫你注入的實作是哪個,加上也只需要用
@Autowire 或 Contructor 方式注入,完全不須自己實作 new 的部分,甚至注入的實作本
身的依賴也一併由 Spring 幫你搞定,達到關注點分離,讓你可以直接在 Service 使用Repository,藉此達到專注在 Service 本身的邏輯
結論:
DI(Denpendency Injection) 跟 IoC(Inversion of Control) 的目的都不是為了解耦
要解耦先考慮用抽象隔離,再考慮用 Spring DI/IoC 的功能幫助降低實作的複雜度
至於抽象穩定那就是另外的問題了...
--
推分享
推
推,我前面的觀念是SOLID的DI,混淆到Spring的DI了
推
太神啦
推
推
推
推這篇,就是反轉依賴的方向的
推
推
推
推優質文
推,謝謝說明!
IoC是設計原則,DI是實現IoC的方式之一,另一種是
Service Locator。沒有DI搭配IoC使用這種說法
抱歉,我用詞不精準,你是對的 不過 FYI,實作 IoC 不止這兩種方式
舒服
這篇正解
20
在這個時代依賴注入最重要的用途,特別是在後端開發是讓Application 在多個不同的 環境下(Development, Production, local, etc) 能夠根據profile 組出能正確執行的Application 多型在這裡當然有他的地位,但是一般來說,大部分不接觸system boundary的service objects 是不太需要多型的,如果是java,那種一個interface 只有一個implementation2
來補一下 "如何驗證效果" 的部份 首先假設情境, A 是你的 Web App B 是那個要被 Spring 注入的東西, 假設在 "外部" "其它人開發的 jar" 裡面 驗證的項目 1. B "改變" 時, A 需要做哪些事?10
很久沒寫Java了 就個人觀念提供簡單思考線索 基本上根據你的內容覺得你對解耦合還沒有很理解 講直白一點 當你import類別就是耦合了25
首Po推文有個連結有解答我的疑惑 感謝bron大 文章有點長 先說說我對依賴注入的理解 Spring boot
爆
Re: [問卦] 紫微斗數的「夫妻宮」,交往能算嗎?新的修文回應: 感謝版友的肯定與厚愛,推文經計算後大概千來人參加抽選,很顯然是並不容易抽到@@ 過年後我會再寫一篇文章推廣斗數與命理觀念,並再多安排一些額度抽選。 年初三用程式抽選的結果如下: A組中選:yun1989 HarukaLM爆
[問卦]派愛族(pairs)使用一個月後的感想,燒錢之前講了一款JD燒錢又只能把裡面的女人當女皇一樣對待 在那邊參加女性發起的約會都是你要付錢,很多女人都是蹭免費大餐 另外一位鄉民已經親身說明他靠著帥氣照片,讓開約的女性挑選中勝出 最後結果是他看到龍,藉著尿遁付完錢就跑了。就結果來說JD的女性還是賺到 現在來說說派愛族這款,因為我說也有購買,鄉民私底下就問我使用感想爆
Re: [問卦] 石雕是如何雕出薄紗質感的?原文吃光光 轉貼給碰友看了原Po命題,收到了豪認真的回覆,順勢轉上PTT科科 ----------- 原Po問到石雕是怎麼雕的,這個問題分成幾個層面: 第一個層面是,石雕是用什麼工具雕的?以照片中大理石加工來說,我們這個年代是以人造爆
Re: [問卦] 整天說白色蟑螂,結果到最後都綠的?當做閒聊 我也是自己在亂猜的 卡神原謝系 後來謝系被英派收編 卡神2019明顯在幫英派和暖男在PTT發文 製造大量蔡英文FB爆文爆
[問卦] 有生的跟你說羨慕你沒生…是幹話嗎?小弟年近40,婚後約10年,目前膝下無子。 我爸媽或岳父母以前會催 但我考量很多因素,不想生,我老婆也不想生,所以他們長輩也就放棄了哈 只是我們自己的親戚朋友,或是堂哥姐,表弟妹等等,大多是同年齡層的 總會跟我們說,好羨慕你們沒有生小孩喔,可以過兩人世界真好,想去那就去拿,又說養爆
Re: [問卦] 福原愛完全沒在鳥自己兩個孩子的喔?其實也未必會完全不理不睬,但就不會爭扶養權 也不會把他們帶在身邊,就可能變成那種分離家庭的"遠距離親情"模式 保持一定的親情聯繫,但不會屬於同一家庭 如此方能夠自由地"做自己" 福原愛這一連串行為模式,雖然很令人傻眼,但說穿了10
Re: [問卦] 打高端的怎麼都縮起來了?我本人高端仔,有圖為證: 我不知道別人打疫苗的目的是什麼,可能有人是為了出國。不過我的目的只有一個: 降低感染COVID-19或重症的風險。 我打了高端,沒什麼不舒服。有沒有效我也不知道,但至少沒被感染,有達到目的。56
[閒聊] XSS/XSX購入前需要知道有關 VRR 的事情鑑於越來越多人買 Xbox Series 系列 然後在挑選螢幕時都犯了錯誤,這半年出現了不少"我玩XSX好LAG "的言論 覺得有必要科普一下 VRR 技術跟 XBOX 遊戲廠商當前主流的畫質調適: 我先說結論: ------------