控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。編程
依賴反轉在Spring中的體現是依賴注入。 緩存
類經過引用來進行合做,這種引用造成了類之間的依賴,若是這種依賴關係須要對象本身管理,那麼代碼會產生高度的耦合,致使開發和測試上的困難。若是這種依賴的管理交給框架來作,將簡化面向對象系統的複雜性,這就是依賴的反轉。框架
容器用來管理應用中的對象和其之間的依賴關係。BeanFactory是對容器的一種抽象,ApplicationContext是其高級實現。函數
總體過程分三步:測試
注意這裏只是有Bean的載入,而不是依賴注入,依賴注入發生在第一次經過getBean
向容器獲取Bean的時候。spa
在發起getBean
方法時,纔會進行依賴注入,建立響應的bean。 設計
依賴注入過程以下:代理
最後建立目標bean實例。code
在IoC初始化後,Bean並無被實際的建立。在getBean
後,纔會有bean的實例化,bean的生命週期以下: 對象
建立bean實例->設置bean的屬性->調用bean的初始化方法(initialization)->應用可使用bean->容器關閉,銷燬bean
上述可知,bean會在使用時纔會真正的建立,這防止了建立大量用不到的bean實例。
固然,能夠經過設置參數,讓bean在IoC容器初始化完畢後就建立。
Bean通常狀況下不須要知道IoC容器的存在,有時候則須要。Bean能夠實現一些aware接口來得到想要的容器屬性。
如ApplicationContextAware,能夠在Bean中得到上下文,從而在Bean中使用上下文。
分離關注點使解決特定領域問題的代碼從業務邏輯中獨立出來。
Advice通知:描述方法調用注入的切面行爲。
Pointcut切點:用來描述須要加強的方法集合。
Advisor通知器:將Advice和Pointcut結合起來。
在代理模式中,會設計一個和目標對象有着一致接口的代理對象Proxy,客戶端對目標對象的請求都會發送給代理對象,而客戶端對此毫無察覺。
該模式使得Proxy有機會對原始的對象的行爲進行必定的修改,能夠在執行前和執行後分別執行必定的動做,從而加強原始行爲。
首先須要定義一些Advisor,這些Advisor定義了須要織入的加強功能,也就是涵蓋了通知的內容。而後定義ProxyFactoryBean,它將會生成目標的代理對象。在配置中,ProxyFactoryBean須要知道其代理的目標是誰,代理的接口是哪一個,有哪些Advisor須要添加。
ProxyFactoryBean生成AopProxy過程:
生成代理對象。
AopProxy工做過程:
通知器封裝爲攔截器:
invoke
方法會根據before、after或者throw將advice的加強行爲放置到適當位置。適配器默認是上述的三種,能夠自定義adapter註冊進來,以生成本身定製的intercepter。