依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)
DIP,IoC與DI概念解析
依賴倒置
DIP(Dependency Inversion Principle)
DIP的兩大原則:
1、高層模塊不應該依賴于低層模塊,二者都應該依賴于抽象。
2、抽象不應該依賴于細節,細節應該依賴于抽象。
具體來講,依賴倒置的核心思想是針對接口而不是實現編程。
應用DIP可以降低模塊之間的耦合度,只要接口保持穩定,模塊可以獨立演化而互不影響。
控制反轉
IoC(Inversion of Control)
通常情況下,class A依賴于class B,或者應用DIP之后依賴于Interface B,那么在運行時,我們必須自行主動的去實例化Interface B接口的實現類實例,然后將其引用傳遞給Class A,在傳統的編程模型下,我們經常這樣干。這樣耦合度仍然很高,我們必須知道所依賴的實現類的一些細節。
而IoC則是將實例化被依賴模塊的責任交出去,不再主動去做依賴裝配工作,這樣我們就可以徹底的只針對接口編程,而無需關心具體的實現。
IoC容器成為一個系統的對象容器和粘合劑,它負責創建對象的實例,并按照它們聲明的依賴關系把它們粘合起來共同工作。通過配置文件或注解的方法,IoC容器會自動的滿足模塊之間的依賴關系,而無需我們再主動去處理依賴關系,只要被動接受就可以了。
這種依賴關系的滿足由主動實現到被動接受的轉變,就是所謂的控制反轉了。
IoC與好萊塢原則(Don't call me,i'll call you!)比較相似。
依賴注入
DI(Dependency Injection)
依賴注入是實現控制反轉的主要方式,另一種方式是依賴查找。
兩者的區別在于,依賴注入是被動的接收對象,而依賴查找是主動索取響應名稱的對象,獲得依賴對象的時間也可以在代碼中自由控制。依賴查找更加主動,在需要的時候通過調用框架提供的方法來獲取對象,獲取時需要提供相關的配置文件路徑、key等信息來確定獲取對象的狀態。比如使用JNDI來查找資源。
依賴注入有以下幾種實現方式:
1、接口注入或叫Type 1型注入。需要實現特定接口以供外部容器注入所依賴類型的對象。這里有一個寫的比較好的例子。這種注入方式很少用到。
2、setter注入或叫Type 2型注入。實現特定屬性的public set方法,來讓外部容器調用傳入所依賴類型的對象。這種注入方式是最常見的。
3、構造函數注入或叫Type 3型注入。實現特定參數的構造函數,在新建對象時傳入所依賴類型的對象。
4、注解注入。基于Java的注解功能,在私有變量前加“@Autowired”等注解,不需要顯式的定義以上三種代碼,便可以讓外部容器傳入對應的對象。該方案相當于定義了public的set方法,但是因為沒有真正的set方法,從而不會為了實現依賴注入導致暴露了不該暴露的接口(因為set方法只想讓容器訪問來注入而并不希望其他依賴此類的對象訪問)。注解注入是比較好的注入實現方式。
總的來講,依賴倒置(DIP)是一種設計原則,控制反轉(IoC)是一種處理對象間依賴關系的方式,與傳統的主動方式正好相反,而依賴注入(DI)則是IoC容器實現控制反轉的主要方式。
總結
以上是生活随笔為你收集整理的依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Enterprise Architect
- 下一篇: 如何利用抽象工厂更换数据库