spring学习笔记(12)@AspectJ研磨分析[3]增强织入顺序实例详解

这篇博客详细解析了Spring中@AspectJ切面的增强织入顺序,包括同一切面内、不同切面间以及实现Ordered接口或使用@Order注解时的顺序规则,并通过实例验证了这些规则。
摘要由CSDN通过智能技术生成

增强的织入顺序

当一个连接点同时织入多个增强时,就存在顺序调用问题:
1. 增强在同一个切面类中定义:依照增强在切面类中定义的顺序依次织入。
2. 增强位于不同的切面,但果这些切面都实现了org.springframework.core.Ordered
接口,则由接口注解的顺序号决定,顺序号越小,对于不同的增强,织入顺序为:
1. 前置增强->越先织入
2. 后置增强->越后织入
3. 最终增强->越后织入
4. 环绕增强->调用原方法之前的部分先织入,调用原方法之后的部分后织入
我们先来看一个实例:

1.目标对象

package test.aop2;

public class UserController {
   
    public void login(String name){
        System.out.println("I'm "+name+" ,I'm logining");
    }
}

2. 切面配置

/*-----------------------有序切面类1--------------------------*/
@Aspect
public class Annotation_aspect implements Ordered {
   //实现顺序接口

    @Pointcut("target(test.aop2.UserController)")
    private void pointcut(){}//定义切点

    @AfterThrowing("pointcut()")//后置增强
    public void AfterThrowing() throws Throwable{
        System.out.println("Annotation_aspect 实施AfterThrowing,优先级为" + getOrder());
    }
    @After("pointcut()")//最终增强
    public void after() throws Throwable{
        System.out.println("Annotation_aspect 实施after,优先级为" + getOrder());
    }
    @Before("pointcut()")//前置增强
    public void before() throws Throwable{
        System.out.println("Annotation_aspect 实施@before,优先级为" + getOrder());
    }
    @Around("pointcut()")//环绕增强
    public void around(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("Annotation_aspect 实施around前,优先级为" + getOrder());
        joinPoint.proceed();
        System.out.println("Annotation_aspect 实施around后,优先级为" + getOrder());
    }

    @Override
    public int getOrder() {
        return 1;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值