使用@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的使用

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

相关文章

  • spring boot自动装配之@ComponentScan注解用法详解

    spring boot自动装配之@ComponentScan注解用法详解

    @ComponentScan的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中,下面这篇文章主要给大家介绍了关于spring boot自动装配之@ComponentScan注解用法的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java开发工具Eclipse使用技巧全局搜索和更替

    Java开发工具Eclipse使用技巧全局搜索和更替

    这篇文章主要介绍了Java开发工具Eclipse使用技巧全局搜索和更替,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 解决mybatis一对多关联查询多条数据只显示一条的问题

    解决mybatis一对多关联查询多条数据只显示一条的问题

    这篇文章主要介绍了解决mybatis一对多关联查询多条数据只显示一条的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • SpringBoot整合定时任务的方法

    SpringBoot整合定时任务的方法

    通过 ThreadPoolExecutor 可以实现各式各样的自定义线程池,而 ScheduledThreadPoolExecutor 类则在自定义线程池的基础上增加了周期性执行任务的功能,这篇文章主要介绍了SpringBoot整合定时任务,需要的朋友可以参考下
    2024-05-05
  • SpringBoot安全认证Security的实现方法

    SpringBoot安全认证Security的实现方法

    这篇文章主要介绍了SpringBoot安全认证Security的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • java实现静默加载Class示例代码

    java实现静默加载Class示例代码

    这篇文章主要给大家介绍了关于java实现静默加载Class的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • 如何用struts调用支付宝接口

    如何用struts调用支付宝接口

    以下为大家介绍如何用struts调用支付宝接口的例子。
    2013-04-04
  • Java 中组合模型之对象结构模式的详解

    Java 中组合模型之对象结构模式的详解

    这篇文章主要介绍了Java 中组合模型之对象结构模式的详解的相关资料,希望通过本文能帮助到大家理解应用对象结构模型,需要的朋友可以参考下
    2017-09-09
  • SpringBoot2 集成log4j2日志框架的实现

    SpringBoot2 集成log4j2日志框架的实现

    这篇文章主要介绍了SpringBoot2 集成log4j2日志框架的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 5分钟快速了解String.trim()到底做了什么事

    5分钟快速了解String.trim()到底做了什么事

    trim方法一般用来去除空格,但是根据JDK API的说明,该方法并不仅仅是去除空格,它能够去除从编码'\u0000'至'\u0020'的所有字符,这篇文章主要给大家介绍了如何通过5分钟快速了解String.trim()到底做了什么事,需要的朋友可以参考下
    2021-11-11

最新评论