Spring 2.x框架學習(連載)-瞭解AOP – JAVA編程語言程序開發技術文章

前言:


本文章會通過連載的方式來深入瞭解和學習Spring相關核心技術和實現原理。包括Spring的Bean生命周期管理,聲明性事務管理,AOP管理,註解應用實現,以及在其上面進行擴展的相關應用。


本篇技術文章介紹Spring AOP的實現。


先來瞭解一下AOP的相關概念:


1)Aspect(切面):指橫切性關註點的抽象即為切面。與類相似,隻是兩者的關註點不同,類是對物體特征的抽象,而切面是橫切性關註點的抽象。


2)Joinpoint(連接點):指一些被攔截到的點。在Spring中,這些點指的是方法,因為Spring隻支持方法類型的連接點,實際上連接點還可以是field或類構造器。


3)Advice(通知):指攔截到連接點之後所要做的事情,分為前置通知,後置通知,異常通知,最終通知和環繞通知。


4)Pointcut(切入點):指對那些Jointpoint進行攔截的定義。


5)Target(目標對象):代理要實現的目標對象。


6)Weave(織入):指將Aspects應用到Target對象並導致proxy對象創建的過程。


7)Introduction(引入):在不修改類代碼的前提下,Introduction可以在運行期間為類動態地添加一些方法或屬性



Spring的AOP配置功能非常強大,如自動代理(autoproxy),提供XML和註解的配置方式。無論是哪個配置支持,其最終的本質則是通過 JdkDynamicAopProxy或 CglibProxyFactory 完成對象的AOP攔截支持。


下面將通過其中一種配置方式(基於Bean名稱的自動代理支持),來講解一下Spring AOP的實現原理:


下面是一個配置示例:





BeanNameAutoProxyCreator為名字匹配字符串或者通配符的bean自動創建AOP代理。


下面是BeanNameAutoProxyCreator的類圖,其是實現瞭BeanPostProcessor接口。





在上一章節介紹Spring Bean生命周期管理的時候,介紹過BeanPostProcessor 是實現Spring在對Bean對象進行實例化前後,回調相應的方法。


那麼BeanNameAutoProxyCreator就是實現瞭 postProcessBeforeInstantiation 方法,對Bean對象進行實現化前,進行AOP的增強操作。


核心的代碼如下:





代碼中,會調用createProxy 方法,實現對象實例的自動代碼封裝實現。


接著分析代碼: createProxy方法,其實就是調用瞭Spring的ProxyFactory對象進行代理的封裝實現


下面標註瞭主要實現代碼:





接下來 AopProxyFactory是Spring提供的一個接口類,Spring默認使用的DefaultAopProxyFactory實現類。


我們再來分析一下createAopProxy方法的實現, 下面標註的主要實現代碼



註:上面的代碼我們發現Spring對於Bean對象的AOP處理采用瞭兩種方式,如果是有接口的類則采用JDKDynamicAopProxy,如果是普通的類,則采用CglibProxyFacotry實現。關於Cglib這個項目的說明,大傢可以參見其官方網站的說明。


<SPAN style="FONT-FAMILY: 宋

發佈留言