@Order 注解定义了类、方法和字段的优先级(排序情况),value 是可选的,默认为Ordered.LOWEST_PRECEDENCE,即最低优先级。表示 Ordered 接口中的 order 属性。

目前看到的 @Order 注解都是用在类上的,没有看到过用在方法和字段上的,包括 Spring 自有类 DefaultErrorAttributes、LogbackLoggingSystem.Factory 等。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {
​/*** 优先级排序值,value 的值越大,优先级越低* 默认值为 Ordered.LOWEST_PRECEDENCE(Integer.MAX_VALUE) * @see Ordered#getOrder()*/int value() default Ordered.LOWEST_PRECEDENCE;
​
}

从 Spring 4.0 开始,Spring 中的很多组件都支持基于 Order 注解的排序,但是使用了该注解后,不会影响bean的加载顺序,Bean的加载顺序是由依赖关系和 @DependsOn 注解来决定的。

我们定义两个bean:OrderBean1和OrderBean2,然后通过 @Bean 注入到容器中,启动 SpringBoot 应用,看看打印情况。

public class OrderBean1 {
​public OrderBean1() {System.out.println("init Order Bean 1");}
}
​
public class OrderBean2 {
​public OrderBean2() {System.out.println("init Order Bean 2");}
}
​
@Configuration
@Order(200)
public class BeanConfig {
​public BeanConfig() {System.out.println("bean config");}
​@Beanpublic OrderBean1 orderBean1() {return new OrderBean1();}
}
​
​
@Configuration
@Order(100)
public class BeanConfig2 {
​public BeanConfig2() {System.out.println("bean config 2");}
​@Beanpublic OrderBean2 orderBean2() {return new OrderBean2();}
}

虽然 BeanConfig 和 BeanConfig2 都加了 Order 注解,且 BeanConfig2 的优先级更高,但是实际的日志打印是

bean config
bean config 2
init Order Bean 1
init Order Bean 2

BeanConfig2 并没有优先于 BeanConfig 进行加载。

如果想要 BeanConfig2 优先加载,可以借助 @DependsOn 注解。

@Configuration
@DependsOn("beanConfig2")
public class BeanConfig1 {
​public BeanConfig1() {System.out.println("bean config 1");}
​@Bean@DependsOn("orderBean2")public OrderBean1 orderBean1() {return new OrderBean1();}
}

日志打印为:

bean config 2
bean config 1
init Order Bean 2
init Order Bean 1

那 Order 注解在什么场景下才能使用呢?在进行执行顺序的排序时使用。

public interface OrderBean {void order();
}
​
@Order(200)
public class OrderBean1 implements OrderBean{
​@Overridepublic void order() {System.out.println("order bean1 --->  order command");}
}
​
@Order(100)
public class OrderBean2 implements OrderBean{@Overridepublic void order() {System.out.println("order bean2 --->  order command");}
}
​
@Configuration
public class BeanCommandConfig {
​public BeanCommandConfig(List<OrderBean> orderBeans) {orderBeans.forEach(orderBean -> orderBean.order());}
}

输出信息为

order bean2 --->  order command
order bean1 --->  order command

可以看到,先输出了 bean2 的内容,再输出了 bean1 的内容。

SpringBoot中的典型应用就是 CommandLineRunner。

Interface used to indicate that a bean should run when it is contained within a SpringApplication. Multiple CommandLineRunner beans can be defined within the same application context and can be ordered using the Ordered interface or @Order annotation.

翻译:多个CommandLineRunner bean 可以在同一个应用程序上下文中定义,并且可以使用Ordered接口或@Order注释进行排序

示例如下:

@Component
@Order(5)
public class Runner1 implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("runner 1 start");}
}
​
@Component
@Order(1)
public class Runner2 implements CommandLineRunner {
​@Overridepublic void run(String... args) throws Exception {System.out.println("runner 2 start");}
}   

启动 SpringBoot 工程,查看控制台输出

runner 2 start
runner 1 start

可以看到,两个 Runner 按照配置的优先级执行,先运行 Runner2,再运行 Runner1。

从 Spring 4.1 开始,jakarta.annotation.Priority 可在一些排序场景中替代 @Order 的作用。

除了这两个注解外,也可以实现 Ordered 接口,来设置优先级信息,相对使用注解的方式更加灵活。

SpringBoot排序之Order注解相关推荐

  1. SpringBoot 系列教程(二十三) :使用@Order注解调整配置类加载顺序

    1 .@Order    1.Spring 4.2 利用@Order控制配置类的加载顺序, 2.Spring在加载Bean的时候,有用到order注解.   3.通过@Order指定执行顺序,值越小, ...

  2. 难以想象SpringBoot中的条件注解底层居然是这样实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  3. 面试:SpringBoot中的条件注解底层是如何实现的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  4. java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口

    前言 Spring的@Order注解或者Ordered接口大家都知道是控制顺序的,那么它们到底是控制什么顺序的?是控制Bean的注入顺序,还是Bean的实例化顺序,还是Bean的执行顺序呢?那么我们先 ...

  5. @order注解_Spring Boot+OAuth2,一个注解搞定单点登录!

    今日干货 刚刚发表查看:66666回复:666 公众号后台回复 ssm,免费获取松哥纯手敲的 SSM 框架学习干货. 需要先说一下,松哥最近写的教程,都是成系列的,有一些重复的东西写来写去就没意思了, ...

  6. Spring @Order注解的使用

    注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响: 目 ...

  7. SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版

    SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版 注解版: 1.改druid 连接池,不改可以跳过这步 添加依赖 <dependency><groupId& ...

  8. R语言ggplot2可视化按照因子排序(order of facets)可视化分组多子图(facet、面图)实战

    R语言ggplot2可视化按照因子排序(order of facets)可视化分组多子图(facet.面图)实战 目录

  9. HOL中的四种排序,Order By、Sort By、Distribute By、Cluster By

    1.全局排序(Order By) Order By:全局排序,一个Reducer 1.使用 ORDER BY 子句排序 ASC(ascend): 升序(默认) DESC(descend): 降序 2. ...

  10. 2/7 SELECT语句:排序(ORDER BY)

    序号 说明 操作 1 排序数据 ORDER BY 2 按多个列排序 用,分隔 3 指定排序方向 降序:DESC 或 升序(默认):ASC 4 ORDER BY结合LIMIT 顺序:FROM-ORDER ...

最新文章

  1. 每日程序C语言26-直接选择排序
  2. windows监控txt写入_Windows的bug们
  3. docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器
  4. 26.如何实现关机时清空页面文件:
  5. left join效率为什么低_为什么自考的你学习效率特别低?对号入座
  6. The single product is priced at about 1350 yuan
  7. 计分器 java_非常实用的java语言自动答题计时计分器[Java代码]
  8. 微信公众号 html样式,公众号模板制作精美,微信公众号素材管理的正文,可以写自己CSS 样式吗?...
  9. php如何用sql语句修改数据库,SQL语句进行数据表的增删改查教程(phpMyAdmin使用教程)...
  10. 【uniapp小程序】uploadFile文件上传
  11. 恒瑞、百济之外,再鼎开辟了中国医药创新又一极
  12. 如何用Matlab做一个3D头像
  13. 大学计算机实验图灵机模型与计算机硬件,北理大学计算机实验基础 实验一_图灵机模型与计算机硬件系统虚拟拆装-实验报告...
  14. oracle创建用户并授权select,oracle创建用户并授权,oracle创建用户并授权select
  15. html下拉菜单怎么竖直,导航条(垂直/水平/下拉菜单)
  16. Golang四舍五入保留两位小数
  17. Web课程设计之学生成绩管理系统
  18. Oracle数据库的冷备份和热备份
  19. 企业OA有哪些好处?所有企业都要用OA吗?
  20. 安卓:Kotlin数据库框架GreenDao的使用

热门文章

  1. 计算机桌面我是电脑丢失,计算机修改用户后,桌面文件丢失. 电脑桌面
  2. 金蝶凭证序时簿在哪_怎么用金蝶kis记账王打开会计分录序时簿
  3. Navicat备份数据库和还原数据库详解
  4. win7 安装 python3.8.10
  5. js设计模式:什么是单例模式?js单例模式的介绍
  6. appliedzkp的zkevm(7)定制化Proof System
  7. 核磁为什么要做ROI分析?
  8. java实现识别二维码图片功能
  9. C51单片机引脚名词英文全称
  10. ssm医院挂号就诊预约系统毕业设计源码250853