日常问题记录:Spring @PostConstruct和CommandLineRunner 的执行顺序问题

问题描述

在脚手架中使用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容器的初始化流程决定的。

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值