当前位置: 首页 > article >正文

Spring Boot的启动流程,以及各个扩展点的执行顺序

目录

1. 初始化阶段执行顺序

1.1 Bean的构造方法(构造函数)

1.2 @PostConstruct 注解方法

1.3 InitializingBean 的 afterPropertiesSet()

1.4 @Bean(initMethod = "自定义方法")

2. 上下文就绪后的扩展点

2.1 ApplicationContext 事件监听器

2.2 ApplicationRunner 与 CommandLineRunner

3. 完整执行顺序总结

4. 控制执行顺序的方法

5. 示例代码验证


        在Spring Boot应用中,容器初始化及组件执行的顺序遵循特定的生命周期。以下是常见的初始化组件及其执行顺序的详细说明,帮助您合理控制代码逻辑的加载顺序。


1. 初始化阶段执行顺序

以下是Spring Boot应用启动时,各初始化方法的执行顺序(从上到下依次执行):

1.1 Bean的构造方法(构造函数)
  • 触发时机:Bean实例化时。
  • 说明:Bean被容器创建时,构造函数首先被调用。
@Component
public class MyBean {public MyBean() {System.out.println("构造方法执行");}
}
1.2 @PostConstruct 注解方法
  • 触发时机:Bean依赖注入完成后。
  • 说明:在Bean属性赋值(如@Autowired注入)之后执行。
@Component
public class MyBean {@PostConstructpublic void init() {System.out.println("@PostConstruct方法执行");}
}
1.3 InitializingBean 的 afterPropertiesSet()
  • 触发时机:与@PostConstruct类似,但由Spring原生接口提供。
  • 说明:在Bean属性设置完成后执行,优先于自定义的init-method
@Component
public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean的afterPropertiesSet执行");}
}
1.4 @Bean(initMethod = "自定义方法")
  • 触发时机:在@PostConstructInitializingBean之后执行。
  • 说明:通过@Bean注解显式指定的初始化方法。
@Configuration
public class AppConfig {@Bean(initMethod = "customInit")public AnotherBean anotherBean() {return new AnotherBean();}
}public class AnotherBean {public void customInit() {System.out.println("@Bean的initMethod执行");}
}

2. 上下文就绪后的扩展点

当所有Bean初始化完成后,应用进入上下文就绪阶段:

2.1 ApplicationContext 事件监听器
  • ContextRefreshedEvent 监听器:当ApplicationContext初始化或刷新完成后触发。
    @Component
    public class MyContextListener {@EventListener(ContextRefreshedEvent.class)public void onContextRefreshed() {System.out.println("ContextRefreshedEvent事件触发");}
    }
    
2.2 ApplicationRunner 与 CommandLineRunner
  • 触发时机:在上下文就绪后、应用启动完成前执行。
  • 执行顺序:通过@Order或实现Ordered接口控制多个Runner的顺序。
    @Component
    @Order(1)
    public class MyAppRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) {System.out.println("ApplicationRunner执行");}
    }@Component
    @Order(2)
    public class MyCmdRunner implements CommandLineRunner {@Overridepublic void run(String... args) {System.out.println("CommandLineRunner执行");}
    }
    

3. 完整执行顺序总结

以下是典型场景下各组件的执行顺序:

  1. Bean构造函数 → @PostConstruct → InitializingBean → @Bean(initMethod)
  2. ContextRefreshedEvent 监听器
  3. ApplicationRunner → CommandLineRunner

4. 控制执行顺序的方法

  • @Order 注解:为ApplicationRunnerCommandLineRunner和事件监听器指定优先级,值越小优先级越高。
  • @DependsOn 注解:强制指定Bean的依赖关系,间接影响初始化顺序。
  • 实现Ordered接口:替代@Order注解,动态控制顺序。

5. 示例代码验证

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

输出结果

构造方法执行
@PostConstruct方法执行
InitializingBean的afterPropertiesSet执行
@Bean的initMethod执行
ContextRefreshedEvent事件触发
ApplicationRunner执行
CommandLineRunner执行

通过理解这些执行顺序,您可以更精准地安排初始化逻辑(如数据库连接、缓存预热等),避免因顺序问题导致的依赖错误。

http://www.lryc.cn/news/2398706.html

相关文章:

  • 【LUT技术专题】图像自适应3DLUT代码讲解
  • Apache Doris 在数据仓库中的作用与应用实践
  • vscode使用“EIDE”和“Cortex-Debug”插件利用st-link插件实现程序烧写以及调试工作
  • Spring @Value注解的依赖注入实现原理
  • 三、kafka消费的全流程
  • 商品模块中的多规格设计:实现方式与电商/ERP系统的架构对比
  • (三)动手学线性神经网络:从数学原理到代码实现
  • Axure形状类组件图标库(共8套)
  • 20250530-C#知识:String与StringBuilder
  • 从 Docker 到 Containerd:Kubernetes 容器运行时迁移实战指南
  • uniapp中view标签使用范围
  • Celery 核心概念详解及示例
  • 欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!
  • IDEA 在公司内网配置gitlab
  • 黑马Java面试笔记之 微服务篇(业务)
  • 通过WiFi无线连接小米手机摄像头到电脑的方法
  • 长短期记忆(LSTM)网络模型
  • 深入理解 Linux 文件系统与日志文件分析
  • CSS3美化页面元素
  • 网络安全-等级保护(等保)3-0 等级保护测评要求现行技术标准
  • WPS 利用 宏 脚本拆分 Excel 多行文本到多行
  • R语言错误处理方法大全
  • AI“实体化”革命:具身智能如何重构体育、工业与未来生活
  • Opencv4 c++ 自用笔记 05 形态学操作
  • DrissionPage 数据提取技巧全解析:从入门到实战
  • 如何构建自适应架构的镜像
  • R语言基础| 创建数据集
  • 剑指offer15_数值的整数次方
  • Centos7搭建zabbix6.0
  • 使用Redis的四个常见问题及其解决方案