您的位置:首页 > 编程语言 > Java开发

Spring AOP(五)之Around增强处理

2016-03-06 12:28 459 查看
@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]执行目标方法之后,模拟结束事务…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: