SpringAOP03_2

本文详细介绍了Spring AOP中的环绕通知,强调其功能强大并能完全控制连接点,包括何时及是否执行。环绕通知必须使用ProceedingJoinPoint作为参数,并通过调用proceed()执行原方法,否则会导致目标方法未执行。还讨论了环绕通知与其他通知的执行顺序,以及如何通过Order调整切面优先级。最后,列举了AOP的常见应用场景,如日志记录、权限验证、安全检查和事务控制。
摘要由CSDN通过智能技术生成

一、环绕通知

1、环绕通知是所有通知类型中功能最为强大的,能够全面地控制连接点,甚至可以控制是否执行连接点。
2、对于环绕通知来说,连接点的参数类型必须是ProceedingJoinPoint。它是 JoinPoint的子接口,允许控制何时执行,是否执行连接点。
3、在环绕通知中需要明确调用ProceedingJoinPoint的proceed()方法来执行被代理的方法。如果忘记这样做就会导致通知被执行了,但目标方法没有被执行。
4、注意:环绕通知的方法需要返回目标方法执行之后的结果,即调用 joinPoint.proceed();的返回值,否则会出现空指针异常。

环绕通知

@Aspect
@Component
public class LogUtils {
   
	/**
	 * @throws Throwable 
	 * @Around:环绕	:是Spring中强大的通知;顺序正常
	 * @Around:环绕:动态代理;
	 * 	try{
	 * 			//前置通知
	 * 			method.invoke(obj,args);
	 * 			//返回通知
	 * 	}catch(e){
	 * 			//异常通知
	 *  }finally{
	 * 			//后置通知
	 * 	}
	 * 		
	 * 	四合一通知就是环绕通知;
	 * 	环绕通知中有一个参数:	ProceedingJoinPoint pjp
	 * 
	 *环绕通知:是优先于普通通知执行,执行顺序;
	 */
	@Around("hahaMyPoint()")
	public Object myAround(ProceedingJoinPoint pjp) throws Throwable{
   
		
		Object[] args = pjp.getArgs();
		String name = pjp.getSignature().getName();
		//args[0] = 100;
		Object proceed = null;
		try {
   
			//@Before
			System.out.println("【环绕前置通知】【"+name+"方法开始】");
			//就是利用反射调用目标方法即可,就是method.invoke(obj,args)
			proceed = pjp.proceed(args);
			//@AfterReturing
			System.out.println("【环绕返回通知】【"+name+"方法返回,返回值"+proceed+"】");
		} catch (Exception e) {
   
			//@AfterThrowing
			System.out.println("【环绕异常通知】【"+name+"】方法出现异常,异常信息:"+e);
			//为了让外界能知道这个异常,这个异常一定抛出去
			throw new RuntimeException(e);
		} finally{
   
			//@After
			System.out.println("【环绕后置通知】【"+name+"】方法结束");
		}
		
		//反射调用后的返回值也一定返回出去,若这里写死了,那么上面的try没有用了,很明显@Around是一个动态代理
		return proceed;
	}
}

二、 环绕通知加上普通通知执行顺序

/**
 * 如何将这个类(切面类)中的这些方法(通知方法)动态的在目标方法运行的各个位置切入
 * @author lfy
 *
 */
@Aspect
@Component
public class LogUtils {
   
	

	@Pointcut("execution(public int com.atguigu.impl.MyMathCalculator.*(..))")
	public void hahaMyPoint(){
   };
	


	
	//想在执行目标方法之前运行;写切入点表达式
	//execution(访问权限符  返回值类型  方法签名)
	@Before("hahaMyPoint()")
	public static void logStart(JoinPoint joinPoint){
   
		//获取到目标方法运行是使用的参数
		Object[] args = joinPoint.getArgs();
		//获取到方法签名
		Signature signature = joinPoint.getSignature();
		String name = signature.getName();
		System.out.println("[LogUtils-前置]【"+name+"】方法开始执行,用的参数列表【"+Arrays.asList(args)+"】");
	}
	

	//想在目标方法正常执行完成之后执行
	@AfterReturning(value="hahaMyPoint()",returning="result")
	public static void logReturn(JoinPoint joinPoint
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值