软件编程
位置:首页>> 软件编程>> java编程>> 使用@Order控制配置类/AOP/方法/字段的加载顺序详解

使用@Order控制配置类/AOP/方法/字段的加载顺序详解

作者:公瑾子敬  发布时间:2023-09-05 17:34:35 

标签:@Order,配置类,AOP,方法,字段,加载顺序

@Order控制配置类/AOP/方法/字段的加载顺序

1.AOP加载顺序

    @Component
    @Aspect
    @Order(1)
    public class Aspect1 {
        ...
        System.out.println("aop-1 加载了");
    }
    @Component
    @Aspect
    @Order(2)
    public class Aspect2 {
        ...
        System.out.println("aop-2 加载了");
    }

执行顺序: 

  • aop-1 加载了

  • aop-2 加载了

2.配置类加载顺序

@Configuration
@Order(1)
public class DemoConfig1 {
    @Bean
    public Demo1Service demo1Service(){
        System.out.println("config-1 加载了");
        return new Demo1Service();
    }
}
@Configuration
@Order(2)
public class DemoConfig2 {
    @Bean
    public Demo2Service demo2Service(){
        System.out.println("config-2 加载了");
        return new Demo2Service();
    }
}

执行顺序: 

  • config-1 加载了

  • config-2 加载了

tips:

Integer.MIN_VALUE <= Order <= Integer.MAX_VALUE

Order值越小,优先级越高!

@Order的作用范围:

ElementType.TYPE, ElementType.METHOD, ElementType.FIELD

@Order使用与Aop多切面执行顺序

@Order:设置该类在spring容器中的加载顺序, 越小越早优先加载

多个Aop是可以切同一点的, 比如, 想把@ApiOperation(Swag注解的)地方再自定义增强一下, 比如 持久化一行操作日志到数据库, 那就可以自定义一个注解, 切同一个位置, * 自己想干的事.

那多个Aop的优先顺序(默认按切面工具类的名称首字母a-z执行顺序, 也就是spring默认的加载顺序), 可以使用@order自己定义顺序,

值得注意的是:

  • 环绕前置(即point.proceed()前面的代码)

  • 环绕后置(即point.proceed()后面的代码)

try{  
    try{  
        doBefore();//对应@Before注解的方法切面逻辑  
        method.invoke();  
    }finally{  
        doAfter();//对应@After注解的方法切面逻辑  
    }  
    doAfterReturning();//对应@AfterReturning注解的方法切面逻辑
    //在
}catch(Exception e){  
     doAfterThrowing();//对应@AfterThrowing注解的方法切面逻辑  
}

使用@Order控制配置类/AOP/方法/字段的加载顺序详解

另外, 如果情况是允许耦合的, 可以创建新注解继承原注解, 或这继承多个原注解, 这样就自定义扩展并组合注解了

todo:@AfterReturning的使用

来源:https://blog.csdn.net/l718161567/article/details/74912424

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com