Spring技術(shù)內(nèi)幕(二):AOP(一)


一,概述


1. 原理:面向切面編程

從關(guān)注點中分離出橫切關(guān)注點右蕊,通俗點講,即將解決特定領(lǐng)域問題的代碼從業(yè)務(wù)邏輯中脫離出來茉兰。舉個栗子尤泽,簡單的增刪改中一般有事務(wù)管理,但事務(wù)管理與業(yè)務(wù)邏輯無關(guān),是一個特定重復的操作坯约,這個時候熊咽,我們就可以把事務(wù)管理從增刪改的業(yè)務(wù)邏輯中脫離出來。在這里闹丐,我們的關(guān)注點就是增刪改等業(yè)務(wù)邏輯横殴,橫切關(guān)注點就是事務(wù)管理。


2.1 Advice通知

  1. 作用:
  • 描述Spring AOP圍繞方法調(diào)用而注入的切面行為卿拴。
  1. 類型(這里只列舉三種)
  • BeforeAdvice:在目標實例的方法(即衫仑,JoinPoint:連接點)執(zhí)行前嵌入執(zhí)行額外功能。
  • AfterAdvice:在目標實例的方法執(zhí)行后嵌入執(zhí)行額外功能堕花。
  • ThrowAdvice:在目標實例的方法拋出異常時執(zhí)行Advice文狱。

2.2 Pointcut切點

決定Advice通知應該作用于哪個連接點。


2.3 Advisor通知器

用來結(jié)合Advice和Pointcut


二缘挽,Spring AOP實現(xiàn)的核心技術(shù)


動態(tài)代理

這里以JVM的動態(tài)代理模式舉例

  • 圖解代理模式:


    JVM動態(tài)代理.png

    如圖3-9瞄崇,代理對象Proxy與目標對象RealSubject實現(xiàn)了同一個接口Subject。當調(diào)用目標對象的request()方法時壕曼,往往會被代理對象攔截苏研。通過這種攔截, 為目標對象的方法操作做了鋪墊腮郊,所以稱之為代理模式摹蘑。


三,建立AopProxy代理對象


1. 設(shè)計原理

ProxyFactory相關(guān)的類繼承關(guān)系:


Proxy類繼承關(guān)系.png
  • ProxyConfig:數(shù)據(jù)基類轧飞,為子類提供配置屬性
  • AdvisedSupport:封裝了AOP對通知和通知器的相關(guān)操作
  • ProxyCreatorSupport:子類創(chuàng)建AOP代理對象的輔助類衅鹿,繼承以上提到的基類的功能實現(xiàn)
  • AspectJProxyFactory:具體的AOP代理對象的生成。集成Spring和AspectJ踪少。
  • ProxyFactory:具體的AOP代理對象的生成塘安。為使用Spring AOP的應用提供AOP功能的封裝。需要編程式使用Spring AOP功能援奢。
  • ProxyFactoryBean:具體的AOP代理對象的生成兼犯。為使用Spring AOP的應用提供AOP功能的封裝〖可以在IOC容器中完成聲明式配置切黔。

2. 配置ProxyFactoryBean

<!--配置ProxyFactoryBean-->
    <!--1,定義使用的通知器Advisor-->
    <bean id="testAdvisor" class="com.abc.TestAdvisor"/>
    <!--2具篇,定義ProxyFactoryBean-->
    <bean id="testAOP" class="org.springframework.aop.framework.ProxyFactoryBean"/>
    <!--3纬霞,設(shè)定與AOP實現(xiàn)相關(guān)的重要屬性-->
    <!--3.1,proxyInterface-->
    <property name="proxyInterfaces"><value>com.test.AbcInterface</value></property>
    <!--3.2驱显,target(目標對象)-->
    <property name="target">
        <bean class="com.abc.TestTarget"/>
    </property>
    <!--3.3诗芜,interceptorNames(需要定義的通知器)-->
    <property name="interceptorNames">
        <list><value>testAdvisor</value></list>
    </property>

3. ProxyFactoryBean生成AopProxy代理對象

AopProxy的生成過程:兩種方式瞳抓,依賴JDK或者CGLIB提供的Proxy特性。


AopProxy的生成過程.png
  • initializeAdvisorChain():初始化通知器鏈伏恐,通知器鏈中封裝了一系列從配置中讀取的攔截器孩哑,為代理對象的生成做好準備。
  • getSingletonInstance():生成Singleton類型的Proxy
  • DefaultAopProxyFactory:AopProxy接口類翠桦,AopProxy有兩個子類實現(xiàn)横蜒,一個是JdkDynamicAopProxy,一個是CglibProxyFactory

4. JDK生成AopProxy代理對象

// JdkDynamicAopProxy生成Proxy代理對象
    @Override
    public Object getProxy(ClassLoader classLoader) {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource());
        }
        // 1销凑,從advised對象中取得代理對象的代理接口配置
        Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
        findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
        // 2丛晌,調(diào)用JDK生成Proxy
        return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
    }
  • newProxyInstance方法:需要指明3個參數(shù),類裝載器斗幼,代理接口澎蛛,Proxy回調(diào)方法所在的對象,這個對象要實現(xiàn)InvocationHandler接口
  • InvocationHandler接口: 反射類接口蜕窿,定義了invoke方法瓶竭,提供代理對象的回調(diào)入口。

5. CGLIB生成AopProxy代理對象

Cglib2AopProxy生成AopProxy代理對象


CGLIB生成Proxy代理對象.png

配置Enhancer對象渠羞,通過Enhancer對象的callback回調(diào)設(shè)置生成代理對象。其中通過設(shè)置DynamicAdvisedInterceptor攔截器來完成AOP功能的智哀。


參考資料:Spring技術(shù)內(nèi)幕(第2版) 計文柯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末次询,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瓷叫,更是在濱河造成了極大的恐慌屯吊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摹菠,死亡現(xiàn)場離奇詭異盒卸,居然都是意外死亡,警方通過查閱死者的電腦和手機次氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門蔽介,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人煮寡,你說我怎么就攤上這事虹蓄。” “怎么了幸撕?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵薇组,是天一觀的道長。 經(jīng)常有香客問我坐儿,道長律胀,這世上最難降的妖魔是什么宋光? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮炭菌,結(jié)果婚禮上罪佳,老公的妹妹穿的比我還像新娘。我一直安慰自己娃兽,他們只是感情好菇民,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著投储,像睡著了一般第练。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玛荞,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天娇掏,我揣著相機與錄音,去河邊找鬼勋眯。 笑死婴梧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的客蹋。 我是一名探鬼主播塞蹭,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼讶坯!你這毒婦竟也來了番电?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤辆琅,失蹤者是張志新(化名)和其女友劉穎漱办,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婉烟,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡娩井,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了似袁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洞辣。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叔营,靈堂內(nèi)的尸體忽然破棺而出屋彪,到底是詐尸還是另有隱情,我是刑警寧澤绒尊,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布畜挥,位于F島的核電站,受9級特大地震影響婴谱,放射性物質(zhì)發(fā)生泄漏蟹但。R本人自食惡果不足惜躯泰,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望华糖。 院中可真熱鬧麦向,春花似錦、人聲如沸客叉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兼搏。三九已至卵慰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佛呻,已是汗流浹背裳朋。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吓著,地道東北人鲤嫡。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像绑莺,于是被迫代替她去往敵國和親暖眼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理纺裁,服務(wù)發(fā)現(xiàn)罢荡,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 本博中關(guān)于spring的文章:Spring IOC和AOP原理对扶,Spring事務(wù)原理探究,Spring配置文件屬性...
    Maggie編程去閱讀 4,098評論 0 34
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架惭缰。Spring框架的核心功能可以應用在任何Jav...
    jemmm閱讀 16,445評論 1 133
  • 四浪南,Spring AOP攔截器調(diào)用的實現(xiàn) 1. 設(shè)計原理 在Spring AOP通過JDK的Proxy方式或者CG...
    WhyNotYue閱讀 1,830評論 5 4
  • **** AOP 面向切面編程 底層原理 代理!J堋络凿! 今天AOP課程1、 Spring 傳統(tǒng) AOP2昂羡、 Spri...
    luweicheng24閱讀 1,359評論 0 1