- 问题:
项目中使用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的时候会自己去实例里面找。结果,是自己想多了。。
本文解析了Spring框架中@Order注解的正确使用方法,纠正了将其错误地应用在@Bean标注方法上的常见误区,强调应将@Order置于Class级别以确保任务按预期顺序执行。
3693

被折叠的 条评论
为什么被折叠?



