posts - 156,  comments - 601,  trackbacks - 0

          前言:

          本文章會通過連載的方式來深入了解和學習Spring相關(guān)核心技術(shù)和實現(xiàn)原理。包括SpringBean生命周期管理,聲明性事務(wù)管理,AOP管理,注解應(yīng)用實現(xiàn),以及在其上面進行擴展的相關(guān)應(yīng)用。

          本篇技術(shù)文章介紹Spring AOP的實現(xiàn)。

          先來了解一下AOP的相關(guān)概念:

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

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

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

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

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

          6)Weave(織入):指將Aspects應(yīng)用到Target對象并導致proxy對象創(chuàng)建的過程。

          7)Introduction(引入):在不修改類代碼的前提下,Introduction可以在運行期間為類動態(tài)地添加一些方法或?qū)傩?/span>

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

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

          下面是一個配置示例:


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

          下面是BeanNameAutoProxyCreator的類圖,其是實現(xiàn)了BeanPostProcessor接口。


          在上一章節(jié)介紹Spring Bean生命周期管理的時候,介紹過BeanPostProcessor 是實現(xiàn)Spring在對Bean對象進行實例化前后,回調(diào)相應(yīng)的方法。

          那么BeanNameAutoProxyCreator就是實現(xiàn)了 postProcessBeforeInstantiation 方法,對Bean對象進行實現(xiàn)化前,進行AOP的增強操作。

          核心的代碼如下:


          代碼中,會調(diào)用createProxy 方法,實現(xiàn)對象實例的自動代碼封裝實現(xiàn)。

          接著分析代碼: createProxy方法,其實就是調(diào)用了SpringProxyFactory對象進行代理的封裝實現(xiàn)

          下面標注了主要實現(xiàn)代碼:


          接下來 AopProxyFactorySpring提供的一個接口類,Spring默認使用的DefaultAopProxyFactory實現(xiàn)類。

          我們再來分析一下createAopProxy方法的實現(xiàn), 下面標注的主要實現(xiàn)代碼


          注:上面的代碼我們發(fā)現(xiàn)Spring對于Bean對象的AOP處理采用了兩種方式,如果是有接口的類則采用JDKDynamicAopProxy,如果是普通的類,則采用CglibProxyFacotry實現(xiàn)。關(guān)于Cglib這個項目的說明,大家可以參見其官方網(wǎng)站的說明。

          下面是JdkDynamicAopProxy類的代理實現(xiàn),就是使用JDKProxy類進行代理處理


          基于JdkDynamicAopProxy封裝的實例,AOP攔截都會回調(diào) JdkDynamicAopProxyinvoke方法

          基于CglibProxyFactory則通過Cglib2AopProxygetProxy方法實現(xiàn)實例對象的增強

          下面對其主要的代碼進行標記:

          至此SpringAOP的代理的封裝過程已經(jīng)介紹完成。下面我們來看一下AOP切面的通知機制實現(xiàn)。

          下面就只以JdkDynamicAopProxy為例,Cglib也是類同。

          剛才介紹過基于JdkDynamicAopProxy封裝的實例,AOP攔截都會回調(diào) JdkDynamicAopProxyinvoke方法

          下面來分析一下invoke的主要代碼:

          上面的代碼截取自JdkDyanmicAopProxyinvoke方法, 首先會獲得所有的Advice通過方式,然后通過反射的方式來應(yīng)用這些通知方式。


          獲后就可以根據(jù)不同的通知實現(xiàn),來攔截處理方法的切面的回調(diào)操作。

          SpringAOP主要實現(xiàn)原理過程就已經(jīng)介紹完成。

          本章節(jié)完.


          Good Luck!

          Yours Matthew!



          posted on 2011-04-01 10:52 x.matthew 閱讀(2355) 評論(0)  編輯  收藏 所屬分類: Spring|Hibernate|Other framework
          主站蜘蛛池模板: 左权县| 乌兰察布市| 永德县| 古田县| 北票市| 宁夏| 富民县| 太原市| 衡东县| 宝兴县| 军事| 宝山区| 虹口区| 福建省| 嘉祥县| 绍兴市| 滁州市| 宝山区| 嘉善县| 高邑县| 沙湾县| 溆浦县| 康平县| 安泽县| 金昌市| 涪陵区| 北宁市| 衡阳县| 库车县| 孟州市| 丽江市| 望江县| 习水县| 嘉兴市| 宝兴县| 天全县| 瑞丽市| 隆林| 奈曼旗| 浙江省| 翼城县|