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

目录
  • @Order控制配置类/AOP/方法/字段的加载顺序
    • 1.AOP加载顺序
    • 2.配置类加载顺序
  • @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注解的方法切面逻辑  
     } 
    

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

    todo:@AfterReturning的使用

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

    本文转自网络,如有侵权请联系客服删除。