@Around注解用于修飾Around增強(qiáng)處理,,Around增強(qiáng)處理是功能比較強(qiáng)大的增強(qiáng)處理,,它近似于Before增強(qiáng)處理和AfterReturing增強(qiáng)處理的總結(jié),Around增強(qiáng)處理既可在執(zhí)行目標(biāo)方法之前增強(qiáng)動(dòng)作,,也可在執(zhí)行目標(biāo)方法之后織入增強(qiáng)的執(zhí)行,。與Before增強(qiáng)處理、AfterReturning增強(qiáng)處理不同的是,,Around增強(qiáng)處理可以決定目標(biāo)方法在什么時(shí)候執(zhí)行,,如何執(zhí)行,甚至可以完全阻止目標(biāo)方法的執(zhí)行,。
當(dāng)定義一個(gè)Around增強(qiáng)處理方法時(shí),,該方法的第一個(gè)形參必須是ProceedJoinPoint類型(至少含有一個(gè)形參),在增強(qiáng)處理方法體內(nèi),,調(diào)用ProceedingJoinPoint參數(shù)的procedd()方法才會(huì)執(zhí)行目標(biāo)方法——這就是Around增強(qiáng)處理可以完全控制方法的執(zhí)行時(shí)機(jī),、如何執(zhí)行的關(guān)鍵;如果程序沒有調(diào)用ProceedingJoinPoint參數(shù)的proceed()方法,,則目標(biāo)方法不會(huì)被執(zhí)行,。下面定義一個(gè)Around增強(qiáng)處理。
- // 定義一個(gè)切面
- @Aspect
- public class TxAspect
- {
- // 匹配com.owen.app.service.impl包下所有類的,、
- // 所有方法的執(zhí)行作為切入點(diǎn)
- @Around("execution(* com.owen.app.service.impl.*.*(..))")
- public Object processTx(ProceedingJoinPoint jp)
- throws java.lang.Throwable
- {
- System.out.println("執(zhí)行目標(biāo)方法之前,,模擬開始事務(wù)...");
- // 獲取目標(biāo)方法原始的調(diào)用參數(shù)
- Object[] args = jp.getArgs();
- if(args != null && args.length > 1)
- {
- // 修改目標(biāo)方法的第一個(gè)參數(shù)
- args[0] = "【增加的前綴】" + args[0];
- }
- // 以改變后的參數(shù)去執(zhí)行目標(biāo)方法,并保存目標(biāo)方法執(zhí)行后的返回值
- Object rvt = jp.proceed(args);
- System.out.println("執(zhí)行目標(biāo)方法之后,,模擬結(jié)束事務(wù)...");
- // 如果rvt的類型是Integer,,將rvt改為它的平方
- if(rvt != null && rvt instanceof Integer)
- rvt = (Integer)rvt * (Integer)rvt;
- return rvt;
- }
- }
該應(yīng)用的目標(biāo)Bean類,依然是HelloImpl.java和WorldImple.java,這兩個(gè)類與SpringAOP(一)Before增強(qiáng)處理中的類是一樣的,,這里就寫出,,讀者可以到前面章節(jié)參考。執(zhí)行主程序的結(jié)果如下,。
- [java] 信息:Loading XML bean definitions from class path resource…
- [java]執(zhí)行目標(biāo)方法之前,,模擬開始事務(wù)…
- [java]執(zhí)行Hello組件的foo()方法
- [java]執(zhí)行目標(biāo)方法之后,,模擬結(jié)束事務(wù)…
- [java]執(zhí)行目標(biāo)方法之前,模擬開始事務(wù)…
- [java]執(zhí)行Hello組件的addUser添加用戶:【增加的前綴】owen
- [java]執(zhí)行目標(biāo)方法之后,,模擬結(jié)束事務(wù)…
- [java]addUser()的返回值為:400
- [java]執(zhí)行目標(biāo)方法之前,,模擬開始事務(wù)…
- [java]執(zhí)行World組件的bar()方法
- [java]執(zhí)行目標(biāo)方法之后,模擬結(jié)束事務(wù)…
|