Spring AOP動態代理源碼淺析

Spring中兩個要點,aop和ioc,咱們都知道aop是面向切面編程,經常使用於日誌管理之類的,原理呢?編程

Spring的核心原理是經過動態代理模式在方法執行先後或出現異常時加入相關的邏輯。測試

1.AOP是基於動態代理模式。spa

2.AOP是方法級別的(要測試的方法不能爲static修飾,由於接口中不能存在靜態方法,編譯就會報錯)。3d

3.AOP能夠分離業務代碼和關注點代碼(重複代碼),在執行業務代碼時,動態的注入關注點代碼。切面就是關注點代碼造成的類。代理

動態代理:日誌

動態代理分爲JDK代理和Cglib代理,看一下Spring的DefaultAopProxyFactory源碼:cdn


從上述源碼片斷能夠看出,是否使用cglib是在代碼中進行判斷的,判斷條件首先是config.isOptimize()、config.isProxyTargetClass()和hasNoUserSuppliedProxyInterfaces(config)。其中config.isOptimize()與config.isProxyTargetClass()默認返回都是false,這種狀況下判斷結果就由hasNoUserSuppliedProxyInterfaces(config)的結果決定:



因此簡單的說「 hasNoUserSuppliedProxyInterfaces(config)「就是判斷代理的對象是否有實現的接口,有的話直接走JDK代理的分支。對象

其次經過方法createAopProxy中能夠看到 new ObjenesisCglibAopProxy(config)和new JdkDynamicAopProxy(config)blog

那麼Spring是如何生成代理對象的呢?接口

1.建立容器對象的時候,根據切入點表達式攔截的類,生成代理對象

2.動態代理,上面源代碼的判別中能夠看出,若是目標對象有實現接口,使用JDK代理;不然用Cglib代理。

3.而後從容器獲取代理後的對象,在運行期植入「切面」類的方法。

呃呃呃,就這樣吧!

相關文章
相關標籤/搜索