@Around注解用于修饰Around增强处理,Around增强处理是功能比较强大的增强处理,它近似于Before增强处理和AfterReturing增强处理的总结,Around增强处理既可在执行目标方法之前增强动作,也可在执行目标方法之后织入增强的执行。与Before增强处理、AfterReturning增强处理不同的是,Around增强处理可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标方法的执行。
当定义一个Around增强处理方法时,该方法的第一个形参必须是ProceedJoinPoint类型(至少含有一个形参),在增强处理方法体内,调用ProceedingJoinPoint参数的procedd()方法才会执行目标方法——这就是Around增强处理可以完全控制方法的执行时机、如何执行的关键;如果程序没有调用ProceedingJoinPoint参数的proceed()方法,则目标方法不会被执行。下面定义一个Around增强处理。
- // 定义一个切面
- @Aspect
- public class TxAspect
- {
- // 匹配com.owen.app.service.impl包下所有类的、
- // 所有方法的执行作为切入点
- @Around("execution(* com.owen.app.service.impl.*.*(..))")
- public Object processTx(ProceedingJoinPoint jp)
- throws java.lang.Throwable
- {
- System.out.println("执行目标方法之前,模拟开始事务...");
- // 获取目标方法原始的调用参数
- Object[] args = jp.getArgs();
- if(args != null && args.length > 1)
- {
- // 修改目标方法的第一个参数
- args[0] = "【增加的前缀】" + args[0];
- }
- // 以改变后的参数去执行目标方法,并保存目标方法执行后的返回值
- Object rvt = jp.proceed(args);
- System.out.println("执行目标方法之后,模拟结束事务...");
- // 如果rvt的类型是Integer,将rvt改为它的平方
- if(rvt != null && rvt instanceof Integer)
- rvt = (Integer)rvt * (Integer)rvt;
- return rvt;
- }
- }
该应用的目标Bean类,依然是HelloImpl.java和WorldImple.java,这两个类与SpringAOP(一)Before增强处理中的类是一样的,这里就写出,读者可以到前面章节参考。执行主程序的结果如下。
- [java] 信息:Loading XML bean definitions from class path resource…
- [java]执行目标方法之前,模拟开始事务…
- [java]执行Hello组件的foo()方法
- [java]执行目标方法之后,模拟结束事务…
- [java]执行目标方法之前,模拟开始事务…
- [java]执行Hello组件的addUser添加用户:【增加的前缀】owen
- [java]执行目标方法之后,模拟结束事务…
- [java]addUser()的返回值为:400
- [java]执行目标方法之前,模拟开始事务…
- [java]执行World组件的bar()方法
- [java]执行目标方法之后,模拟结束事务…