【Spring】关于@PostConstruct和CommandLineRunner

想象一下,你刚买了一台新电脑,这台电脑就好比是我们的Spring Boot应用程序。在你真正开始使用电脑之前,有一些事情是必须要做的:

  1. 装软件(@PostConstruct

    • 就像你在电脑上安装软件一样,@PostConstruct做的事情是在某个特定的组件(比如一个工具或游戏)加载到内存后,立即做一些初始化工作。比如,你可能会设置软件的语言、调整分辨率或是创建一个用户账户。
    • 每次你安装一个新软件,它都会有自己的初始化步骤,这些步骤只对这个软件本身重要。这就是为什么@PostConstruct适用于单个组件的初始化——它关注的是这个组件自己需要做些什么才能准备好。
  2. 设置环境(CommandLineRunner

    • 当你装完所有软件后,你可能会做一些整体的系统设置,比如更新操作系统、安装杀毒软件或是一次性导入所有联系人。这些操作不是针对某个具体软件的,而是为了确保整个系统运行良好。
    • CommandLineRunner的作用与此类似,它在所有软件(也就是Spring Boot中的所有组件)都准备好之后,执行一些全局的初始化任务。这可能包括预加载数据、检查系统环境是否符合要求,或是做一次全面的健康检查。

简而言之,@PostConstruct就像是安装每一个单独的软件时的个性化设置,而CommandLineRunner则是你对整个电脑环境的最后调整,确保一切就绪,可以顺畅运行。

在Spring Boot中,@PostConstruct关注的是单个bean的初始化细节,而CommandLineRunner则关注整个应用层面的初始化任务。

区别:

@PostConstruct:

  • 生命周期@PostConstruct 注解的方法在依赖注入完成后,也就是构造函数和setter方法调用完毕后执行。它属于JSR-250规范的一部分,由Spring框架支持。
  • 执行时机@PostConstruct 方法在Spring Bean的初始化阶段调用,通常在@Autowired字段填充之后,但在Spring的整个启动流程中较早执行,可能在其他初始化逻辑之前。
  • 作用范围: 可以在任何标记了此注解的类中的方法上使用,不限于Spring管理的bean。
  • 执行顺序: 如果一个类中有多个@PostConstruct方法,它们的执行顺序是不确定的。因此,如果你需要控制多个@PostConstruct方法的执行顺序,需要额外的机制,如使用Ordered接口或自定义的排序策略。

CommandLineRunner:

  • 生命周期CommandLineRunner 是Spring Boot特有的,用于在所有Spring Bean初始化完成后执行某些操作。
  • 执行时机: 在Spring Boot应用完全启动后,所有CommandLineRunner bean的run方法会被调用,此时所有的Bean已经被初始化和装配完毕。
  • 作用范围: 仅适用于Spring管理的bean,且必须实现CommandLineRunner接口。
  • 执行顺序: 所有CommandLineRunner bean会按照它们在配置中的自然顺序执行,这意味着你可以在不同的配置类中定义多个CommandLineRunner bean,它们将按照定义的先后顺序执行。

使用场景差异:

  • @PostConstruct 更适合于进行一些基本的初始化工作,比如打开连接、创建线程池等,这些操作通常与单个bean的初始化紧密相关。
  • CommandLineRunner 更适合于执行一些全局性的初始化逻辑,如数据库预加载数据、系统预热、环境检查等,特别是在需要访问其他已初始化的bean或资源时。

总的来说,@PostConstruct更侧重于bean级别的初始化,而CommandLineRunner则更适合于应用级别的初始化任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值