AOP
AOP(Aspect Oriented Programming)面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù)蹦锋,是軟件開發(fā)中的一個(gè)熱點(diǎn)宋距,也是Spring框架中的一個(gè)重要內(nèi)容劝枣,是函數(shù)式編程的一種衍生范型沐扳。利用AOP可以對業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離泥从,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性迫皱,同時(shí)提高了開發(fā)效率歉闰。
相關(guān)名詞
橫切關(guān)注點(diǎn):跨越應(yīng)用程序多個(gè)模塊的方法或功能。與我們業(yè)務(wù)邏輯無關(guān)的卓起,但是需要我們關(guān)注的部分,就是橫切關(guān)注點(diǎn)凹炸。如:日志戏阅,安全,緩存啤它,事務(wù)等等奕筐。。变骡。
切面(aspect):橫切關(guān)注點(diǎn)被模塊化的特殊對象离赫,它是一個(gè)類
通知(advice):切面必須完成的工作,它是類中的一個(gè)方法塌碌。
目標(biāo)(target):被通知的對象
代理(proxy):向目標(biāo)對象應(yīng)用通知之后創(chuàng)建的對象
切入點(diǎn)(PointCut):切面通知執(zhí)行的地點(diǎn)的定義
連接點(diǎn)(JointPoint):與切入點(diǎn)匹配的執(zhí)行點(diǎn)
Spring AOP中渊胸,通過Advice定義橫切邏輯,Spring中支持5種類型的Advice
通知類型----連接點(diǎn)----實(shí)現(xiàn)接口
前置通知? ? 方法前? ?org.springframework.aop.MethodBeforeAdvice
后置通知? ? 方法后? ??org.springframework.aop.AfterReturningAdvice
環(huán)繞通知 方法前后 台妆。翎猛。胖翰。
異常拋出通知? 方法拋出異常
引介通知? ? 類中增加新的方法屬性
使用AOP織入,需要導(dǎo)入一個(gè)依賴包
第一種方式:通過Spring API實(shí)現(xiàn)
首先編寫業(yè)務(wù)接口和實(shí)現(xiàn)類
編寫增強(qiáng)類切厘,一個(gè)前置增強(qiáng)萨咳,一個(gè)后置增強(qiáng)。
method:要執(zhí)行的目標(biāo)對象的方法
objects:被調(diào)用的方法的參數(shù)
Object:目標(biāo)對象
在Spring的文件中注冊疫稿,并實(shí)現(xiàn)aop切入培他,注意導(dǎo)入約束。
測試
Spring的AOP就是將公共的業(yè)務(wù)(日志遗座,安全等)和領(lǐng)域業(yè)務(wù)結(jié)合起來舀凛,當(dāng)執(zhí)行領(lǐng)域業(yè)務(wù)時(shí),將會(huì)把公共業(yè)務(wù)加進(jìn)來员萍,實(shí)現(xiàn)公共業(yè)務(wù)的重復(fù)利用腾降,領(lǐng)域業(yè)務(wù)更加純粹,其本質(zhì)還是動(dòng)態(tài)代理碎绎。
第二種方式:自定義類來實(shí)現(xiàn)AOP
第一步:寫一個(gè)我們自己的切入類
第二步:在Spring中配置
測試
第三種方式:使用注解實(shí)現(xiàn)
第一步:編寫一個(gè)注解實(shí)現(xiàn)的增強(qiáng)類
第二步:在Spring配置文件中螃壤,注冊bean,并增加支持注解的配置
aop:aspectj-autoproxy說明
通過aop命名空間的<aop:aspectj-autoproxy />聲明自動(dòng)為spring容器中那些配置@aspectj切面的bean創(chuàng)建代理,織入切面筋帖。當(dāng)然奸晴,spring 在內(nèi)部依舊采用AnnotationAwareAspectJAutoProxyCreator進(jìn)行自動(dòng)代理的創(chuàng)建工作,但具體實(shí)現(xiàn)的細(xì)節(jié)已經(jīng)被<aop:aspectj-autoproxy?/>隱藏起來了日麸。
<aop:aspectj-autoproxy?/>有一個(gè)proxy-target-class屬性寄啼,默認(rèn)為false,表示使用jdk動(dòng)態(tài)代理織入增強(qiáng)代箭,當(dāng)配為<aop:aspectj-autoproxy?poxy-target-class="true"/>時(shí)墩划,表示使用CGLib動(dòng)態(tài)代理技術(shù)織入增強(qiáng)。不過即使proxy-target-class設(shè)置為false嗡综,如果目標(biāo)類沒有聲明接口乙帮,則spring將自動(dòng)使用CGLib動(dòng)態(tài)代理。