Spring技術內幕筆記(1):IoC和AOP

IoC容器的實現

控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。編程

依賴反轉是什麼

依賴反轉在Spring中的體現是依賴注入。 緩存

類經過引用來進行合做,這種引用造成了類之間的依賴,若是這種依賴關係須要對象本身管理,那麼代碼會產生高度的耦合,致使開發和測試上的困難。若是這種依賴的管理交給框架來作,將簡化面向對象系統的複雜性,這就是依賴的反轉。框架

Spring中的容器是什麼

容器用來管理應用中的對象和其之間的依賴關係。BeanFactory是對容器的一種抽象,ApplicationContext是其高級實現。函數

IoC的初始化過程

總體過程分三步:測試

  1. Resourece定位,也就是定位定義Bean資源的位置。Resourece的位置是多樣的,使用比較多的是FileSystemResourece。
  2. BeanDefinition載入。讀取定義的內容,將用戶定義的Bean表示成BeanDefinition,BeanDefinition是在容器中對POJO的抽象,記錄了配置的bean信息。
  3. 向IoC容器註冊BeanDefinition,IoC用HashMap結構來維護註冊的BeanDefinition。

注意這裏只是有Bean的載入,而不是依賴注入,依賴注入發生在第一次經過getBean向容器獲取Bean的時候。spa

依賴注入過程

在發起getBean方法時,纔會進行依賴注入,建立響應的bean。 設計

依賴注入過程以下:代理

  1. 判斷單例bean是否已經建立,建立過的無需重複建立。
  2. 遞歸建立依賴的bean。
  3. 最後建立目標bean實例。code

    • 實例化Java對象。採用了CGLIB或者JVM反射機制來生成對象。CGLIB能夠在運行期動態的生成新的class。
    • 注入屬性依賴。

Bean的生命週期

在IoC初始化後,Bean並無被實際的建立。在getBean後,纔會有bean的實例化,bean的生命週期以下: 對象

建立bean實例->設置bean的屬性->調用bean的初始化方法(initialization)->應用可使用bean->容器關閉,銷燬bean

Bean的lazy init

上述可知,bean會在使用時纔會真正的建立,這防止了建立大量用不到的bean實例。

固然,能夠經過設置參數,讓bean在IoC容器初始化完畢後就建立。

IoC感知的Bean

Bean通常狀況下不須要知道IoC容器的存在,有時候則須要。Bean能夠實現一些aware接口來得到想要的容器屬性。

如ApplicationContextAware,能夠在Bean中得到上下文,從而在Bean中使用上下文。

AOP的實現

AOP的做用

分離關注點使解決特定領域問題的代碼從業務邏輯中獨立出來。

基本概念

Advice通知:描述方法調用注入的切面行爲。
Pointcut切點:用來描述須要加強的方法集合。
Advisor通知器:將Advice和Pointcut結合起來。

JVM的動態代理

在代理模式中,會設計一個和目標對象有着一致接口的代理對象Proxy,客戶端對目標對象的請求都會發送給代理對象,而客戶端對此毫無察覺。
圖片描述

該模式使得Proxy有機會對原始的對象的行爲進行必定的修改,能夠在執行前和執行後分別執行必定的動做,從而加強原始行爲。

AopProxy的實現原理

首先須要定義一些Advisor,這些Advisor定義了須要織入的加強功能,也就是涵蓋了通知的內容。而後定義ProxyFactoryBean,它將會生成目標的代理對象。在配置中,ProxyFactoryBean須要知道其代理的目標是誰,代理的接口是哪一個,有哪些Advisor須要添加。

ProxyFactoryBean生成AopProxy過程:

  1. 初始化通知器鏈。經過getBean獲取通知器的bean,而後加入。ProxyFactoryBean只在第一次得到AopProxy時初始化。
  2. 生成代理對象。

    • JDK生成,須要設置ClassLoader和代理接口。
    • CGLIB生成。

AopProxy工做過程:

  1. 當目標對象被調用時,會觸發Proxy的回調函數進行攔截。
  2. 首先獲取攔截器。從上述中初始化的通知器鏈中,遍歷並獲取匹配目標方法的通知器,而後獲取通知器對應的攔截器,該結果會被緩存。
  3. 調用器會依次迭代調用攔截器(interceptor)進行加強,最後調用目標方法。

通知器封裝爲攔截器:

  1. 攔截器默認分爲三類:MethodBeforeAdviceIntercepter、AfterReturn...、Throws...。
  2. 一個Advice會多是MethodBeforeAdvice、AfterReturn...、Throws...其中的一個或者多個。
  3. 根據Advice的種類,適配器AdviceAdapter將其包裝爲相應的intercepter,intercepter中的invoke方法會根據before、after或者throw將advice的加強行爲放置到適當位置。適配器默認是上述的三種,能夠自定義adapter註冊進來,以生成本身定製的intercepter。
  4. 調用器執行攔截器鏈的時候,遞歸過程:process(調用器)->invoke(intercepter)->process(調用器)->invoke(下一個intercepter)...->目標方法。因此intercepter會根據本身的種類在遞歸調用前或者後執行advice的方法。
相關文章
相關標籤/搜索