SpringBoot排序之Order注解
@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注解相关推荐
- SpringBoot 系列教程(二十三) :使用@Order注解调整配置类加载顺序
1 .@Order 1.Spring 4.2 利用@Order控制配置类的加载顺序, 2.Spring在加载Bean的时候,有用到order注解. 3.通过@Order指定执行顺序,值越小, ...
- 难以想象SpringBoot中的条件注解底层居然是这样实现的
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...
- 面试:SpringBoot中的条件注解底层是如何实现的?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...
- java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口
前言 Spring的@Order注解或者Ordered接口大家都知道是控制顺序的,那么它们到底是控制什么顺序的?是控制Bean的注入顺序,还是Bean的实例化顺序,还是Bean的执行顺序呢?那么我们先 ...
- @order注解_Spring Boot+OAuth2,一个注解搞定单点登录!
今日干货 刚刚发表查看:66666回复:666 公众号后台回复 ssm,免费获取松哥纯手敲的 SSM 框架学习干货. 需要先说一下,松哥最近写的教程,都是成系列的,有一些重复的东西写来写去就没意思了, ...
- Spring @Order注解的使用
注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响: 目 ...
- SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版
SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版 注解版: 1.改druid 连接池,不改可以跳过这步 添加依赖 <dependency><groupId& ...
- R语言ggplot2可视化按照因子排序(order of facets)可视化分组多子图(facet、面图)实战
R语言ggplot2可视化按照因子排序(order of facets)可视化分组多子图(facet.面图)实战 目录
- HOL中的四种排序,Order By、Sort By、Distribute By、Cluster By
1.全局排序(Order By) Order By:全局排序,一个Reducer 1.使用 ORDER BY 子句排序 ASC(ascend): 升序(默认) DESC(descend): 降序 2. ...
- 2/7 SELECT语句:排序(ORDER BY)
序号 说明 操作 1 排序数据 ORDER BY 2 按多个列排序 用,分隔 3 指定排序方向 降序:DESC 或 升序(默认):ASC 4 ORDER BY结合LIMIT 顺序:FROM-ORDER ...
最新文章
- 每日程序C语言26-直接选择排序
- windows监控txt写入_Windows的bug们
- docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器
- 26.如何实现关机时清空页面文件:
- left join效率为什么低_为什么自考的你学习效率特别低?对号入座
- The single product is priced at about 1350 yuan
- 计分器 java_非常实用的java语言自动答题计时计分器[Java代码]
- 微信公众号 html样式,公众号模板制作精美,微信公众号素材管理的正文,可以写自己CSS 样式吗?...
- php如何用sql语句修改数据库,SQL语句进行数据表的增删改查教程(phpMyAdmin使用教程)...
- 【uniapp小程序】uploadFile文件上传
- 恒瑞、百济之外,再鼎开辟了中国医药创新又一极
- 如何用Matlab做一个3D头像
- 大学计算机实验图灵机模型与计算机硬件,北理大学计算机实验基础 实验一_图灵机模型与计算机硬件系统虚拟拆装-实验报告...
- oracle创建用户并授权select,oracle创建用户并授权,oracle创建用户并授权select
- html下拉菜单怎么竖直,导航条(垂直/水平/下拉菜单)
- Golang四舍五入保留两位小数
- Web课程设计之学生成绩管理系统
- Oracle数据库的冷备份和热备份
- 企业OA有哪些好处?所有企业都要用OA吗?
- 安卓:Kotlin数据库框架GreenDao的使用