<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 156,  comments - 601,  trackbacks - 0

    前言:

    本文章會通過連載的方式來深入了解和學習Spring相關核心技術和實現原理。包括SpringBean生命周期管理,聲明性事務管理,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可以在運行期間為類動態地添加一些方法或屬性

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

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

    下面是一個配置示例:


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

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


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

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

    核心的代碼如下:


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

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

    下面標注了主要實現代碼:


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

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


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

    下面是JdkDynamicAopProxy類的代理實現,就是使用JDKProxy類進行代理處理


    基于JdkDynamicAopProxy封裝的實例,AOP攔截都會回調 JdkDynamicAopProxyinvoke方法

    基于CglibProxyFactory則通過Cglib2AopProxygetProxy方法實現實例對象的增強

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

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

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

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

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

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


    獲后就可以根據不同的通知實現,來攔截處理方法的切面的回調操作。

    SpringAOP主要實現原理過程就已經介紹完成。

    本章節完.


    Good Luck!

    Yours Matthew!



    posted on 2011-04-01 10:52 x.matthew 閱讀(2359) 評論(0)  編輯  收藏 所屬分類: Spring|Hibernate|Other framework
    主站蜘蛛池模板: 日韩一级视频免费观看| 99re6在线精品视频免费播放| 香蕉高清免费永久在线视频| 无码欧精品亚洲日韩一区| 精品国产呦系列在线观看免费| 精品成人一区二区三区免费视频 | 国产午夜精品久久久久免费视| 波霸在线精品视频免费观看| 免费人成无码大片在线观看| 午夜亚洲WWW湿好爽| 成年人视频在线观看免费| 亚洲人成网站色在线观看| 欧洲精品成人免费视频在线观看 | 亚洲精品影院久久久久久| 黄网站免费在线观看| 亚洲熟妇无码乱子AV电影| 国产一区二区三区免费观看在线 | 国产婷婷成人久久Av免费高清| 精品无码国产污污污免费网站| 欧美大尺寸SUV免费| 国产午夜亚洲精品| 国产无遮挡裸体免费视频| AV激情亚洲男人的天堂国语| 亚洲国产香蕉人人爽成AV片久久 | 亚洲国产综合第一精品小说| 成年人网站免费视频| 亚洲熟妇无码一区二区三区导航| 国产黄在线观看免费观看不卡| 97在线免费观看视频| 久久久无码精品亚洲日韩蜜桃| 亚洲免费网站在线观看| 国内免费高清在线观看| 国产精品久久久久久亚洲影视| 精品一区二区三区无码免费视频| 亚洲精品A在线观看| 无码精品一区二区三区免费视频 | 亚洲欧洲日产国码无码久久99| 国产精品亚洲专区在线观看| 国产成人无码a区在线观看视频免费 | 羞羞漫画登录页面免费| 亚洲热线99精品视频|