SpringAOP:应用场景、原理、五大通知、多个aop执行顺序、

参考:https://cloud.tencent.com/developer/article/2206849

一:SpringAOP应用场景

给类的方法做增强处理:加打印日志的操作等

二:SpringAOP原理

JDK动态代理、 Cglib动态代理(都是通过反射实现的)

Spring会自动在JDK动态代理和CGLIB之间转换:主要看类实现了接口、或是普通类(就算实现了接口也可以设置使用Cglib)
JDK动态代理、 Cglib动态代理解析链接

三:SpringAOP 五个通知: 相当于是动态代理里面的委托类里面在目标方法前后添加的方法

@Around: 环绕通知,这是功能最强大的Advice,可以自定义执行顺序
@Before: 前置通知,在被切的方法执行前执行
@AfterRunning: 返回通知,在被切的方法return后执行
@AfterThrowing: 异常通知,在被切的方法抛异常时执行
@After:后置通知,在被切的方法执行后执行,比return更后

在这里插入图片描述

@Aspect
@Component
public class SpringAopExample {

    @Pointcut(value = "execution(* com.qiuridong.do*(..))")
    private void myPointCut() {
        //无需代码
    }

    @Around(value = "myPointCut()")
    public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知中前置通知的功能....");
        Object obj = joinPoint.proceed();
        System.out.println("环绕通知中后置通知的功能....");
        return obj;
    }

    @Before(value = "myPointCut()")
    public void myBefore() {
        System.out.println("前置通知,在目标方法之前先执行的....");
    }

    @AfterReturning(value = "myPointCut()", returning = "obj")
    public void myAfterReturning(Object obj) {
        System.out.println("后置通知,在目标方法之后再执行的(如有异常,则后置通知不会执行).... 目标方法返回值:" + obj);
    }

    @After(value = "myPointCut()")
    public void myAfter() {
        System.out.println("最终通知,总是会被执行的....");
    }
    
    @AfterThrowing(value = "myPointCut()", throwing = "e")
    public void myAfterThrowing(Exception e) {
        System.out.println("异常通知,在目标方法抛出异常时执行的,异常原因是:" + e.getMessage());
    }


}

四:多个aop执行顺序: order的值越小优先级越高

1.通常使用@Order 注解:直接定义顺序:值越小优先级越高

// 值越小优先级越高
@Order(3)
@Component
@Aspect
public class LoggingAspect implements Ordered {

2.实现Ordered 接口重写 getOrder 方法: 值越小优先级越高

@Component
@Aspect
public class LoggingAspect implements Ordered {

    @Override
    public int getOrder() {
        // 返回值越小优先级越高
        return 1;
    }
}

AOP1: 1
AOP2: 2
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值