AOP举例子
切面類TestAspect
Java代碼 ??
?
Java代碼 ??
Java代碼 ??
?
Java代碼 ??
??? ApplicationContext
Java代碼 ??
??? 測(cè)試類AOPTest
Java代碼 ??
??? 運(yùn)行結(jié)果如下:
Java代碼 ??
??? 《Spring參考手冊(cè)》中定義了以下幾個(gè)AOP的重要概念,結(jié)合以上代碼分析如下:
- 切面(Aspect) :官方的抽象定義為“一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對(duì)象”,在本例中,“切面”就是類TestAspect所關(guān)注的具體行為,例 如,AServiceImpl.barA()的調(diào)用就是切面TestAspect所關(guān)注的行為之一。“切面”在ApplicationContext 中<aop:aspect>來(lái)配置。
- 連接點(diǎn)(Joinpoint) :程序執(zhí)行過程中的某一行為,例如,AServiceImpl.barA()的調(diào)用或者BServiceImpl.barB(String _msg, int _type)拋出異常等行為。
- 通知(Advice) :“切面”對(duì)于某個(gè)“連接點(diǎn)”所產(chǎn)生的動(dòng)作,例如,TestAspect中對(duì)com.spring.service包下所有類的方法進(jìn)行日志記錄的動(dòng)作就是一個(gè)Advice。其中,一個(gè)“切面”可以包含多個(gè)“Advice”,例如TestAspect
- 切入點(diǎn)(Pointcut) :匹配連接點(diǎn)的斷言,在AOP中通知和一個(gè)切入點(diǎn)表達(dá)式關(guān)聯(lián)。例如,TestAspect中的所有通知所關(guān)注的連接點(diǎn),都由切入點(diǎn)表達(dá)式execution(* com.spring.service.*.*(..))來(lái)決定
- 目標(biāo)對(duì)象(Target Object) :被一個(gè)或者多個(gè)切面所通知的對(duì)象。例如,AServcieImpl和BServiceImpl,當(dāng)然在實(shí)際運(yùn)行時(shí),Spring AOP采用代理實(shí)現(xiàn),實(shí)際AOP操作的是TargetObject的代理對(duì)象。
- AOP代理(AOP Proxy) 在Spring AOP中有兩種代理方式,JDK動(dòng)態(tài)代理和CGLIB代理。默認(rèn)情況下,TargetObject實(shí)現(xiàn)了接口時(shí),則采用JDK動(dòng)態(tài)代理,例 如,AServiceImpl;反之,采用CGLIB代理,例如,BServiceImpl。強(qiáng)制使用CGLIB代理需要將 <aop:config> 的 proxy-target-class 屬性設(shè)為true
?????? 通知(Advice)類型
- 前置通知(Before advice) :在某連接點(diǎn)(JoinPoint)之前執(zhí)行的通知,但這個(gè)通知不能阻止連接點(diǎn)前的執(zhí)行。ApplicationContext中 在<aop:aspect>里面使用<aop:before>元素進(jìn)行聲明。例如,TestAspect中的doBefore方 法
- 后通知(After advice) :當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)。ApplicationContext中在<aop:aspect>里面 使用<aop:after>元素進(jìn)行聲明。例如,TestAspect中的doAfter方法,所以AOPTest中調(diào)用 BServiceImpl.barB拋出異常時(shí),doAfter方法仍然執(zhí)行
- 返回后通知(After return advice) :在某連接點(diǎn)正常完成后執(zhí)行的通知,不包括拋出異常的情況。ApplicationContext中在<aop:aspect>里面使用<after-returning>元素進(jìn)行聲明。
- 環(huán)繞通知(Around advice) :包圍一個(gè)連接點(diǎn)的通知,類似Web中Servlet規(guī)范中的Filter的doFilter方法。可以在方法的調(diào)用前后完成自定義的行為,也可以選擇不 執(zhí)行。ApplicationContext中在<aop:aspect>里面使用<aop:around>元素進(jìn)行聲明。例 如,TestAspect中的doAround方法。
- 拋出異常后通知(After throwing advice) : 在方法拋出異常退出時(shí)執(zhí)行的通知。 ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素進(jìn)行聲明。例如,TestAspect中的doThrowing方法。
?????? 切入點(diǎn)表達(dá)式
- 通常情況下,表達(dá)式中使用”execution“就可以滿足大部分的要求。表達(dá)式格式如下:
modifiers-pattern:方法的操作權(quán)限
ret-type-pattern:返回值
declaring-type-pattern:方法所在的包
name-pattern:方法名
parm-pattern:參數(shù)名
throws-pattern:異常
其中,除ret-type-pattern和name-pattern之外,其他都是可 選的。上例中,execution(* com.spring.service.*.*(..))表示com.spring.service包下,返回值為任意類型;方法名任意;參數(shù)不作限制的 所有方法。
- 通知參數(shù)
可以通過args來(lái)綁定參數(shù),這樣就可以在通知(Advice)中訪問具體參數(shù)了。例如,<aop:aspect>配置如下
Java代碼 ?TestAspect的doAfter方法中就可以訪問msg參數(shù),但這樣以來(lái) AService中的barA()和BServiceImpl中的barB()就不再是連接點(diǎn),因?yàn)閑xecution(* com.spring.service.*.*(String,..))只配置第一個(gè)參數(shù)為String類型的方法。其中,doAfter方法定義如下:
Java代碼 ?- ? 訪問當(dāng)前的連接點(diǎn)
任何通知(Advice)方法可以將第一個(gè)參數(shù)定義為 org.aspectj.lang.JoinPoint 類型。JoinPoint 接口提供了一系列有用的方法, 比如 getArgs() (返回方法參數(shù))、getThis() (返回代理對(duì)象)、getTarget() (返回目標(biāo))、getSignature() (返回正在被通知的方法相關(guān)信息)和 toString() (打印出正在被通知的方法的有用信息。
轉(zhuǎn)載于:https://www.cnblogs.com/wzyxidian/p/5157893.html
總結(jié)
- 上一篇: Entity Framework 学习初
- 下一篇: ora-14400插入的分区关键字未映射