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

 更新时间:2022年02月14日 11:23:53   作者:公瑾子敬  
这篇文章主要介绍了使用@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的使用

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

相关文章

  • java List 排序之冒泡排序实例代码

    java List 排序之冒泡排序实例代码

    这篇文章主要介绍了java List 排序之冒泡排序实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • IntelliJ IDEA 构建maven多模块工程项目(详细多图)

    IntelliJ IDEA 构建maven多模块工程项目(详细多图)

    这篇文章主要介绍了IntelliJ IDEA 构建maven多模块工程项目(详细多图),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • nacos服务注册命名空间指定方式

    nacos服务注册命名空间指定方式

    文章介绍了Nacos服务注册命名空间的用途,以及如何创建和指定命名空间,命名空间用于隔离不同项目的服务和配置,避免冲突,通过在配置文件中指定命名空间ID,服务会注册到相应的命名空间中,这样可以更好地管理不同环境下的配置文件
    2024-12-12
  • java高效读大文件(csv,text)的几种处理方式

    java高效读大文件(csv,text)的几种处理方式

    这篇文章主要给大家介绍了关于java高效读大文件(csv,text)的几种处理方式,Java中处理大文件时,通常需要采取一些特定的策略来避免内存溢出或性能问题,文中通过代码及图片介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • java String.split 无法使用小数点分割的问题

    java String.split 无法使用小数点分割的问题

    这篇文章主要介绍了java String.split 无法使用小数点分割的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 深入了解Java中Synchronized的各种使用方法

    深入了解Java中Synchronized的各种使用方法

    在Java当中synchronized关键字通常是用来标记一个方法或者代码块。本文将通过示例为大家详细介绍一下Synchronized的各种使用方法,需要的可以参考一下
    2022-08-08
  • 详解spring与shiro集成

    详解spring与shiro集成

    这篇文章主要介绍了详解spring与shiro集成,需要的朋友可以参考下
    2017-09-09
  • MyBatis insert语句返回主键和selectKey标签方式

    MyBatis insert语句返回主键和selectKey标签方式

    这篇文章主要介绍了MyBatis insert语句返回主键和selectKey标签方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java实现公用实体类转Tree结构

    Java实现公用实体类转Tree结构

    这篇文章主要为大家介绍了一个Java工具类,可以实现Java公用实体类转Tree结构,文中的示例代码简洁易懂,感兴趣的小伙伴可以参考一下
    2024-10-10
  • SpringBoot集成Tomcat服务架构配置

    SpringBoot集成Tomcat服务架构配置

    这篇文章主要为大家介绍了SpringBoot集成Tomcat服务架构配置,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论