一.AOP能干什么
AOP主要用于橫切關(guān)注點分離和織入仅偎,因此需要理解橫切關(guān)注點和織入:
- <b>關(guān)注點:</b>可以認(rèn)為是所關(guān)注的任何東西跨蟹,
- <b>關(guān)注點分離:</b>將問題細(xì)化從而單獨部分,即可以理解為不可再分割的組件哨颂;
- <b>橫切關(guān)注點:</b>一個組件無法完成需要的功能喷市,需要其他組件協(xié)作完成怖亭,如日志組件橫切于支付組件患亿;
- <b>織入:</b>橫切關(guān)注點分離后擅编,需要通過某種技術(shù)將橫切關(guān)注點融合到系統(tǒng)中從而完成需要的功能蜕猫,因此需要織入,織入可能在編譯期腹备、加載期衬潦、運(yùn)行期等進(jìn)行。
橫切關(guān)注點可能包含很多植酥,比如非業(yè)務(wù)的:日志镀岛、事務(wù)處理、緩存友驮、性能統(tǒng)計漂羊、權(quán)限控制等等這些非業(yè)務(wù)的基礎(chǔ)功能;還可能是業(yè)務(wù)的:如某個業(yè)務(wù)組件橫切于多個模塊
二.AOP的基本概念
在進(jìn)行AOP開發(fā)前卸留,先熟悉幾個概念:
- <b>連接點(Jointpoint):</b>表示需要在程序中插入橫切關(guān)注點的擴(kuò)展點走越,連接點可能是類初始化、方法執(zhí)行耻瑟、方法調(diào)用旨指、字段調(diào)用或處理異常等等,Spring只支持方法執(zhí)行連接點喳整,在AOP中表示為“在哪里干谆构;
- <b>切入點(Pointcut):</b>選擇一組相關(guān)連接點的模式,即可以認(rèn)為連接點的集合框都,Spring支持perl5正則表達(dá)式和AspectJ切入點模式搬素,Spring默認(rèn)使用AspectJ語法,在AOP中表示為“在哪里干的集合瞬项;
- <b>通知(Advice):</b>在連接點上執(zhí)行的行為蔗蹋,通知提供了在AOP中需要在切入點所選擇的連接點處進(jìn)行擴(kuò)展現(xiàn)有行為的手段何荚;包括前置通知(before advice)囱淋、后置通知(after advice)、環(huán)繞通知(around advice)餐塘,在Spring中通過代理模式實現(xiàn)AOP妥衣,并通過攔截器模式以環(huán)繞連接點的攔截器鏈織入通知;在AOP中表示為“干什么
- <b>方面/切面(Aspect):</b>橫切關(guān)注點的模塊化戒傻,比如上邊提到的日志組件税手。可以認(rèn)為是通知需纳、引入和切入點的組合芦倒;在Spring中可以使用Schema和@AspectJ方式進(jìn)行組織實現(xiàn);在AOP中表示為“在哪干和干什么集合”不翩;**
- <b>引入(inter-type declaration*):</b>也稱為內(nèi)部類型聲明兵扬,為已有的類添加額外新的字段或方法麻裳,Spring允許引入新的接口(必須對應(yīng)一個實現(xiàn))到所有被代理對象(目標(biāo)對象),在AOP中表示為“干什么(引入什么);
- <b>目標(biāo)對象(Target Object):</b>需要被織入橫切關(guān)注點的對象器钟,即該對象是切入點選擇的對象津坑,需要被通知的對象,從而也可稱為“被通知對象”傲霸;由于Spring AOP 通過代理模式實現(xiàn)疆瑰,從而這個對象永遠(yuǎn)是被代理對象,在AOP中表示為“對誰干昙啄;
- <b>AOP代理(AOP Proxy):</b>AOP框架使用代理模式創(chuàng)建的對象穆役,從而實現(xiàn)在連接點處插入通知(即應(yīng)用切面),就是通過代理來對目標(biāo)對象應(yīng)用切面梳凛。在Spring中孵睬,AOP代理可以用JDK動態(tài)代理或CGLIB代理實現(xiàn),而通過攔截器模型應(yīng)用切面伶跷。
- <b>織入(Weaving):</b>織入是一個過程掰读,是將切面應(yīng)用到目標(biāo)對象從而創(chuàng)建出AOP代理對象的過程,織入可以在編譯期叭莫、類裝載期蹈集、運(yùn)行期進(jìn)行。
三.AOP 通知類型
<b>前置通知(Before Advice):</b>在切入點選擇的連接點處的方法之前執(zhí)行的通知雇初,該通知不影響正常程序執(zhí)行流程(除非該通知拋出異常拢肆,該異常將中斷當(dāng)前方法鏈的執(zhí)行而返回)。
<b>后置通知(After Advice):</b>在切入點選擇的連接點處的方法之后執(zhí)行的通知靖诗,包括如下類型的后置通知:后置返回通知(After returning Advice):在切入點選擇的連接點處的方法正常執(zhí)行完畢時執(zhí)行的通知郭怪,必須是連接點處的方法沒拋出任何異常正常返回時才調(diào)用后置通知。
<b>后置異常通知(After throwing Advice):</b>在切入點選擇的連接點處的方法拋出異常返回時執(zhí)行的通知刊橘,必須是連接點處的方法拋出任何異常返回時才調(diào)用異常通知鄙才。
<b>后置最終通知(After finally Advice): </b>在切入點選擇的連接點處的方法返回時執(zhí)行的通知,不管拋沒拋出異常都執(zhí)行促绵,類似于Java中的finally塊攒庵。
<b>環(huán)繞通知(Around Advices):</b>環(huán)繞著在切入點選擇的連接點處的方法所執(zhí)行的通知,環(huán)繞通知可以在方法調(diào)用之前和之后自定義任何行為败晴,并且可以決定是否執(zhí)行連接點處的方法浓冒、替換返回值、拋出異常等等尖坤。
三.AOP代理
AOP代理就是AOP框架通過代理模式創(chuàng)建的對象稳懒,Spring使用JDK動態(tài)代理或CGLIB代理來實現(xiàn),Spring缺省使用JDK動態(tài)代理來實現(xiàn)慢味,從而任何接口都可別代理场梆,如果被代理的對象實現(xiàn)不是接口將默認(rèn)使用CGLIB代理佛致,不過CGLIB代理當(dāng)然也可應(yīng)用到接口。
<b>AOP代理的目的就是將切面織入到目標(biāo)對象</b>