Spring Boot 中使用 CommondLineRunner时 @Order指定顺序不生效的问题处理。

  • 问题:

项目中使用CommondLineRunner 在Spring 初始化完成后执行特定任务,通过@Order指定多个任务的执行顺序不生效。

  • 结论:

@Order的用法错误导致spring 无法正确读取顺序。

正确用法:@Order 应当定义在Class上。

错误用法:在@Bean标注的方法上添加@Order

  • 过程

CommandLineRunner 最终是通过 org.springframework.boot.SpringApplication类的callRunners方法执行。

通过调用AnnotationAwareOrderComparator的sort对多个CommandLineRunner 进行排序。

通过调试可以知道,runners里面的每一个runner为@Bean方法标注的Method返回的对象。

从findOrder的逻辑可以看出在寻找Order值的时候是会从目标Object的Class上去获取Order信息。

所以直接标注在方法上的@Order才会不生效。

  • 有些东西还是想当然了。开始的时候还以为@Order会自己被Spring通过代理的方式注入到@Bean标注的Method返回的实例里面,然后findOrder的时候会自己去实例里面找。结果,是自己想多了。。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值