SpringBoot启动后自动执行方法的各种方式-笔记
1. SpringBoot启动后自动执行方法的各种方式
1.1 @PostConstruct 注解
作用:在依赖注入完成后执行初始化方法。
适用场景:需要在Bean初始化时执行某些操作(如配置、预加载数据)。
注意:该方法在Bean初始化阶段执行,此时应用可能未完全启动(如数据库连接未就绪)。
示例代码:
import javax.annotation.PostConstruct; import org.springframework.stereotype.Component; @Component public class MyPostConstructBean { @PostConstruct public void init() { System.out.println("PostConstruct 方法执行"); // 执行初始化逻辑 } }
1.2. 实现 InitializingBean 接口
作用:通过重写 afterPropertiesSet 方法实现初始化。
适用场景:需要在属性注入后执行操作,与 @PostConstruct 类似但需实现接口。
示例代码:
import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; @Component public class MyInitializingBean implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean 的 afterPropertiesSet 方法执行"); // 执行初始化逻辑 } }
1.3. 实现 ApplicationRunner 接口
作用:在Spring应用上下文刷新后执行,支持接收命令行参数。
适用场景:需要在应用启动完成后执行操作,此时Bean已初始化完毕。
示例代码:
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @Component public class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("ApplicationRunner 执行"); // 执行逻辑,可访问命令行参数 args } }
1.4. 实现 CommandLineRunner 接口
作用:与 ApplicationRunner 类似,但参数为 String[]。
适用场景:需要接收简单命令行参数时使用。
示例代码:
import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("CommandLineRunner 执行"); // 执行逻辑,可访问 args 参数 } }
1.5. 实现 ApplicationListener 接口
作用:通过 ApplicationListener 监听应用完全启动事件。
适用场景:需要在应用完全就绪后执行操作(如启动后发送通知)。
(图片来源网络,侵删)
示例代码:
import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; @Component public class MyApplicationListener implements ApplicationListener { @Override public void onApplicationEvent(ApplicationReadyEvent event) { System.out.println("ApplicationReadyEvent 触发,应用已启动"); // 执行逻辑,此时可安全访问所有Bean } }
1.6. 使用 @Bean 的 initMethod 属性
作用:在Spring配置类中定义Bean时,通过 initMethod 指定初始化方法。
(图片来源网络,侵删)
示例代码:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean(initMethod = "init") public MyBean myBean() { return new MyBean(); } } public class MyBean { public void init() { System.out.println("应用启动后执行: initMethod"); // 在这里添加初始化逻辑 } }
或使用 init-method 属性(XML 配置):
(图片来源网络,侵删)
2.各方式执行时机对比
方法 | 执行时机 |
---|---|
@PostConstruct | Bean 初始化完成后(属性注入后)。 |
InitializingBean | 与 @PostConstruct 类似,属性注入后。 |
ApplicationRunner | 应用上下文刷新后,ApplicationReadyEvent 触发前。 |
CommandLineRunner | 同上。 |
ApplicationListener | 应用完全就绪(所有Bean初始化完成,所有启动任务执行完毕)。 |
根据需求选择合适的方式:
- 需要访问数据库或资源时,建议使用 ApplicationListener 或 CommandLineRunner。
- 简单的Bean初始化逻辑可用 @PostConstruct 或 InitializingBean。
注意事项
- 线程问题:默认在主线程执行,避免长时间阻塞操作,可考虑异步执行(如结合 @Async)。
- 依赖注入:在 @PostConstruct 和 InitializingBean 中无法直接访问其他Bean(需等待初始化完成)。
- 顺序控制:通过 @Order 或实现 Ordered 接口控制多个启动任务的顺序。
相关文档:InitializingBean接口和@PostConstruct-笔记-CSDN博客
3.使用 @Order 控制执行顺序
作用:通过 @Order 或实现 Ordered 接口控制多个启动任务的执行顺序。
示例:在 ApplicationRunner 中使用 @Order
import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(1) // 数值越小优先级越高 public class FirstRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) { System.out.println("第一个执行的 Runner"); } } @Component @Order(2) public class SecondRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) { System.out.println("第二个执行的 Runner"); } }
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。