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

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

@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

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

猜你喜欢

  • Java实现发红包功能

    2023-12-09 10:33:03
  • 在C#中使用Channels的完整教程

    2021-11-03 15:41:28
  • Spring中的事务隔离级别和传播行为

    2022-07-21 18:18:24
  • 详解LeakCanary分析内存泄露如何实现

    2022-12-03 22:04:40
  • Android利用Espresso进行UI自动化测试的方法详解

    2021-09-04 08:02:51
  • mybatis的插件机制示例详解

    2023-02-24 23:46:17
  • Java 语言实现清除带 html 标签的内容方法

    2021-07-29 23:47:43
  • Java调用windows系统的CMD命令并启动新程序

    2021-11-27 17:09:13
  • Android实现淘宝客户端倒计时界面

    2023-09-18 21:25:09
  • 解决@PathVariable对于特殊字符截断的问题

    2021-10-10 08:19:40
  • SpringBoot统一返回JSON格式实现方法详解

    2021-10-03 20:22:52
  • 分析ABA问题的本质及其解决办法

    2021-12-20 13:59:26
  • Android应用内悬浮窗的实现方案示例

    2022-05-07 20:29:24
  • 对比Java中的Comparable排序接口和Comparator比较器接口

    2023-10-29 04:29:51
  • Spring Boot项目使用Flyway的详细教程

    2021-12-19 12:05:58
  • 剑指Offer之Java算法习题精讲链表与字符串及数组

    2022-10-03 19:10:17
  • java实现http的Post、Get、代理访问请求

    2021-10-30 08:13:47
  • java9开始——接口中可以定义private私有方法

    2023-03-27 06:53:15
  • java.exe和javaw.exe的区别及使用方法

    2022-08-27 10:03:39
  • java实现在线预览--poi实现word、excel、ppt转html的方法

    2022-09-29 20:29:41
  • asp之家 软件编程 m.aspxhome.com