posts - 156,  comments - 601,  trackbacks - 0

          前言:

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

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

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

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

          2)Joinpoint(連接點(diǎn)):指一些被攔截到的點(diǎn)。在Spring中,這些點(diǎn)指的是方法,因?yàn)?/span>Spring只支持方法類(lèi)型的連接點(diǎn),實(shí)際上連接點(diǎn)還可以是field或類(lèi)構(gòu)造器。

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

          4)Pointcut(切入點(diǎn)):指對(duì)那些Jointpoint進(jìn)行攔截的定義。

          5)Target(目標(biāo)對(duì)象):代理要實(shí)現(xiàn)的目標(biāo)對(duì)象。

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

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

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

          下面將通過(guò)其中一種配置方式(基于Bean名稱(chēng)的自動(dòng)代理支持),來(lái)講解一下Spring AOP的實(shí)現(xiàn)原理:

          下面是一個(gè)配置示例:


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

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


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

          那么BeanNameAutoProxyCreator就是實(shí)現(xiàn)了 postProcessBeforeInstantiation 方法,對(duì)Bean對(duì)象進(jìn)行實(shí)現(xiàn)化前,進(jìn)行AOP的增強(qiáng)操作。

          核心的代碼如下:


          代碼中,會(huì)調(diào)用createProxy 方法,實(shí)現(xiàn)對(duì)象實(shí)例的自動(dòng)代碼封裝實(shí)現(xiàn)。

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

          下面標(biāo)注了主要實(shí)現(xiàn)代碼:


          接下來(lái) AopProxyFactorySpring提供的一個(gè)接口類(lèi),Spring默認(rèn)使用的DefaultAopProxyFactory實(shí)現(xiàn)類(lèi)。

          我們?cè)賮?lái)分析一下createAopProxy方法的實(shí)現(xiàn), 下面標(biāo)注的主要實(shí)現(xiàn)代碼


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

          下面是JdkDynamicAopProxy類(lèi)的代理實(shí)現(xiàn),就是使用JDKProxy類(lèi)進(jìn)行代理處理


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

          基于CglibProxyFactory則通過(guò)Cglib2AopProxygetProxy方法實(shí)現(xiàn)實(shí)例對(duì)象的增強(qiáng)

          下面對(duì)其主要的代碼進(jìn)行標(biāo)記:

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

          下面就只以JdkDynamicAopProxy為例,Cglib也是類(lèi)同。

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

          下面來(lái)分析一下invoke的主要代碼:

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


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

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

          本章節(jié)完.


          Good Luck!

          Yours Matthew!



          posted on 2011-04-01 10:52 x.matthew 閱讀(2355) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Spring|Hibernate|Other framework
          主站蜘蛛池模板: 阜城县| 濮阳市| 石家庄市| 墨竹工卡县| 肥西县| 杭锦后旗| 同德县| 鱼台县| 哈密市| 普兰店市| 淮滨县| 昭平县| 新津县| 昌平区| 大同市| 通道| 多伦县| 望都县| 长海县| 青海省| 茂名市| 洪江市| 扶沟县| 松原市| 科尔| 佛教| 陆丰市| 青田县| 澄城县| 瑞昌市| 吉隆县| 井冈山市| 贡山| 龙岩市| 镇安县| 清原| 阿拉善左旗| 揭东县| 陇西县| 阿拉尔市| 长治市|