Spring源碼繼承結構比較複雜,看過之後常常會忘記。所以,記錄一下源碼分析的過程,方便之後回顧。本次分析的Spring源碼版本爲3.2.15。編程
另外,一提Spring就是IOC、DI等等,咱們先初步瞭解一下這些概念。設計模式
依賴倒置原則(Dependence Inversion Principle):面向對象設計原則的一種(抽象概念),其餘的還有單一職責原則、里氏替換原則、接口隔離原則、依賴倒置原則、迪米特原則、開-閉原則。源碼分析
控制反轉(Inversion Of Control):它是遵循依賴倒置原則設計的一種設計模式或者說設計思想(仍是停留在概念),所謂控制反轉其實就是依賴對象的獲取權被反轉了,再也不由本身控制,而是由第三方來控制。單元測試
依賴注入(Dependency Injection):依賴注入是實現控制反轉(設計思想)的一種具體實現方式。測試
public class ServiceA{ private ServiceB serviceB;//ServiceB是一個接口 public void toDoMethod(){ serviceB.toDo(); } public ServiceA(){ this.serviceB=new ServiceBImpl1(); } }
public class ServiceA{ private ServiceB serviceB;//ServiceB是一個接口 public void toDoMethod(){ serviceB.toDo(); } }
什麼是依賴倒置呢?this
如上代碼所示,ServiceA中並無ServiceB具體實現,也就是所謂的ServiceA依賴了ServiceB的抽象。在編譯期ServiceA(.高層次的模塊)並無依賴低層次模塊(ServiceB的具體實現),只有真正在運行期須要ServiceB實現的時候纔會有交集,這就大大下降耦合度。spa
依賴倒置原則只是告訴咱們不要依賴具體實現,要依賴抽象。它只是指導思想,具體怎麼去實現呢?控制反轉就是在指導思想下設計出的一套解決方案。設計
高層次模塊中只依賴低層次模塊的抽象(接口或抽象類),建立低層次模塊具體對象的事情再也不由高層次模塊負責,而是交由第三方來完成,在運行期須要的時候再經過某種方式得到低層次模塊的實現。code
到此,仍是隻停留在理論層面。對象
IoC是一個很大的概念,能夠用不一樣的方式來實現。其主要實現方式有兩種:<1>依賴查找(Dependency Lookup):容器提供回調接口和上下文環境給組件。EJB和Apache Avalon都使用這種方式。<2>依賴注入(Dependency Injection):組件不作定位查詢,只提供普通的Java方法讓容器去決定依賴關係。後者是時下最流行的IoC類型,其又有接口注入(Interface Injection),設值注入(Setter Injection)和構造子注入(Constructor Injection)三種方式。
依賴注入是如今最主流的方式。由於它太主流,致使如今ioc已經約等於DI。
咱們提到建立依賴對象的工做由第三方來完成,這個第三方就是IOC容器,它負責理清模塊與模塊直接的依賴關係,而且負責進行依賴注入。
固然,這個容器要作的足夠靈活、可配置。
依賴倒置是指導思想
反轉控制是解決方案
依賴注入是一種具體實施
IOC的優勢:
1.模塊與模塊直接耦合度下降,這樣有利於團隊協做開發、單元測試。
2.面向接口編程,系統靈活性增長。
3.模塊直接的複雜依賴關係、對象的建立以及生命週期管理等都有容器完成。
IOC的缺點:
1.本來簡單經過new就能夠完成的對象建立,如今須要一個複雜過程來完成。
2.面向接口編程,靈活度加強了必然致使效率的下降。
因此說,IOC這種模式不是適合全部的系統,仍是要根據系統特色來選擇是否須要IOC模式。