Spring AOP(五)之Around增强处理

本文深入解析了Spring AOP中Around增强处理的特点与实现方式。通过一个具体的例子展示了如何使用@Around注解来控制目标方法的执行流程,包括修改方法参数、拦截方法执行等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@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]执行目标方法之后,模拟结束事务…



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值