问题描述
在脚手架中使用CommandLineRunner实现了一个容器启动后执行redis多数据源的维护和缓存机制。
在业务模块中的@PostConstruct修饰的方法中获取redis连接获取不到。且配置了@Order注解试图让脚手架的任务执行更优先——@PostConstruct先于CommandLineRunner执行了。
原因
1、优先级问题
这里是一个大致的执行顺序:
1、容器启动,进行依赖注入。
2、所有的@PostConstruct注解的方法按顺序执行。
3、容器启动完成。
4、所有的CommandLineRunner的run方法按顺序执行。
2、@Order不生效
@Order注解的顺序是相对性的,它定义了一个bean在相同层次结构中的顺序。
在Spring框架中,@Order注解主要用于确定具有相同Ordered接口实现的bean之间的顺序。Ordered接口有一个int getOrder()方法,返回值越小,顺序越高(即越先执行)。
当在@PostConstruct和CommandLineRunner这两个不同的层级中使用@Order注解时,它们之间的顺序是由Spring容器的初始化流程决定的。Spring容器首先会处理所有的@PostConstruct注解的方法,然后再执行CommandLineRunner的run方法。这意味着,即使在@PostConstruct方法上使用了@Order注解,它也会在所有CommandLineRunner任务之前执行,因为@PostConstruct是Spring生命周期的一部分,而CommandLineRunner是启动后的任务。
结论
@PostConstruct在依赖注入完成后执行,CommandLineRunner在容器完全启动后执行。
@Order注解修饰的类之间的顺序是由Spring容器的初始化流程决定的。