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

news2025/6/6 2:46:55

目录

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 {
    @PostConstruct
    public void init() {
        System.out.println("@PostConstruct方法执行");
    }
}
1.3 InitializingBean 的 afterPropertiesSet()
  • 触发时机:与@PostConstruct类似,但由Spring原生接口提供。
  • 说明:在Bean属性设置完成后执行,优先于自定义的init-method
@Component
public class MyBean implements InitializingBean {
    @Override
    public 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 {
        @Override
        public void run(ApplicationArguments args) {
            System.out.println("ApplicationRunner执行");
        }
    }
    
    @Component
    @Order(2)
    public class MyCmdRunner implements CommandLineRunner {
        @Override
        public 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.coloradmin.cn/o/2398706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LUT技术专题】图像自适应3DLUT代码讲解

本文是对图像自适应3DLUT技术的代码解读,原文解读请看图像自适应3DLUT文章讲解 1、原文概要 结合3D LUT和CNN,使用成对和非成对的数据集进行训练,训练后能够完成自动的图像增强,同时还可以做到极低的资源消耗。下图为整个模型的…

vscode使用“EIDE”和“Cortex-Debug”插件利用st-link插件实现程序烧写以及调试工作

第一步:安装vscode插件“EIDE”EIDE和“Cortex-Debug”。 第二步:配置EIDE 2.1安装“实用工具”: 2.2 EIDE插件配置:根据安装的keil C51 keil MDK IAR的相关路径设置 第三步:配置Cortex-Debug插件 点击settings.jso…

Spring @Value注解的依赖注入实现原理

Spring Value注解的依赖注入实现原理 一,什么是Value注解的依赖注入二,实现原理三,代码实现1. 定义 Value 注解2. 实现 InstantiationAwareBeanPostProcessor3. 实现 AutowiredAnnotationBeanPostProcessor4. 占位符解析逻辑5. 定义 StringVa…

三、kafka消费的全流程

五、多线程安全问题 1、多线程安全的定义 使用多线程访问一个资源,这个资源始终都能表现出正确的行为。 不被运行的环境影响、多线程可以交替访问、不需要任何额外的同步和协同。 2、Java实现多线程安全生产者 这里只是模拟多线程环境下使用生产者发送消息&…

Axure形状类组件图标库(共8套)

点击下载《月下倚楼图标库(形状组件)》 原型效果:https://axhub.im/ax9/02043f78e1b4386f/#g1 摘要 本图标库集锦精心汇集了8套专为Axure设计的形状类图标资源,旨在为产品经理、UI/UX设计师以及开发人员提供丰富多样的设计素材,提升原型设计…

20250530-C#知识:String与StringBuilder

String与StringBuilder string字符串在开发中经常被用到,不过在需要频繁对字符串进行增加和删除时,使用StringBuilder有利于提升效率。 1、String string是一种引用类型而非值类型(某些方面像值类型)使用“”进行两个string对象的…

从 Docker 到 Containerd:Kubernetes 容器运行时迁移实战指南

一、背景 Kubernetes 自 v1.24 起移除了 dockershim,不再原生支持 Docker Engine,用户需迁移至受支持的 CRI 兼容运行时,如: Containerd(推荐,高性能、轻量级) CRI-O(专为 Kuberne…

uniapp中view标签使用范围

不止用于微信小程序。兼容型号,是uniapp内置组件之一,在uniapp中进行了跨平台适配。支持所有uniapp的平台。如微信小程序、h5、app、支付宝小程序

欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!

🚀 用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞! “我能不能自己用 STM32 或 EFR32 实现一个 BLE 模块?” 答案当然是:能!还能很帅! 👨‍🏭 前…

IDEA 在公司内网配置gitlab

赋值项目链接 HTTPS 将HTTP的链接 ip地址换成 内网地址 例如:https:172.16.100.18/...... 如果出现需要需要Token验证的情况: 参考:Idea2024中拉取代码时GitLab提示输入token的问题_gitlab token-CSDN博客

黑马Java面试笔记之 微服务篇(业务)

一. 限流 你们项目中有没有做过限流?怎么做的? 为什么要限流呢? 一是并发的确大(突发流量) 二是防止用户恶意刷接口 限流的实现方式: Tomcat:可以设置最大连接数 可以通过maxThreads设置最大Tomcat连接数,实现限流,但是适用于单体架构 Nginx:漏桶算法网关,令牌桶算法自定…

通过WiFi无线连接小米手机摄像头到电脑的方法

通过WiFi无线连接小米手机摄像头到电脑的方法 以下是基于Scrcpy和DroidCam两种工具的无线连接方案,需提前完成开发者模式与USB调试的开启(参考原教程步骤): 方法一:Scrcpy无线投屏(无需手机端安装&#xf…

长短期记忆(LSTM)网络模型

一、概述 长短期记忆(Long Short-Term Memory,LSTM)网络是一种特殊的循环神经网络(RNN),专门设计用于解决传统 RNN 在处理长序列数据时面临的梯度消失 / 爆炸问题,能够有效捕捉长距离依赖关系。…

CSS3美化页面元素

1. 字体 <span>标签 字体样式⭐ 字体类型&#xff08;font-family&#xff09; 字体大小&#xff08;font-size&#xff09; 字体风格&#xff08;font-style&#xff09; 字体粗细&#xff08;font-weight&#xff09; 字体属性&#xff08;font&#xff09; 2. 文本 文…

WPS 利用 宏 脚本拆分 Excel 多行文本到多行

文章目录 WPS 利用 宏 脚本拆分 Excel 多行文本到多行效果需求背景&#x1f6e0; 操作步骤代码实现代码详解使用场景注意事项总结 WPS 利用 宏 脚本拆分 Excel 多行文本到多行 在 Excel 工作表中&#xff0c;我们经常遇到一列中包含多行文本&#xff08;用换行符分隔&#xff…

AI“实体化”革命:具身智能如何重构体育、工业与未来生活

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展正在重塑各行各业&#xff0c;而具身智能&#xff08;Embodied AI&#xff09;作为AI领域的重要分支&#xff0c;正逐渐从实验室走向现实应用。具身智能的核心在于让AI系统具备物理实体&#xff0c;能够与环…

R语言基础| 创建数据集

在R语言中&#xff0c;有多种数据类型&#xff0c;用以存储和处理数据。每种数据类型都有其特定的用途和操作函数&#xff0c;使得R语言在处理各种数据分析任务时非常灵活和强大&#xff1a; 向量&#xff08;Vector&#xff09;: 向量是R语言中最基本的数据类型&#xff0c;它…

Centos7搭建zabbix6.0

此方法适用于zabbix6以上版本zabbix6.0前期环境准备&#xff1a;Lamp&#xff08;linux httpd mysql8.0 php&#xff09;mysql官网下载位置&#xff1a;https://dev.mysql.com/downloads/mysql/Zabbix源码包地址&#xff1a;https://www.zabbix.com/cn/download_sourcesZabbix6…

Docker 部署前后端分离项目

1.Docker 1.1 什么是 Docker &#xff1f; Docker 是一种开源的 容器化平台&#xff0c;用于开发、部署和运行应用程序。它通过 容器&#xff08;Container&#xff09; 技术&#xff0c;将应用程序及其依赖项打包在一个轻量级、可移植的环境中&#xff0c;确保应用在不同计算…

云游戏混合架构

云游戏混合架构通过整合本地计算资源与云端能力&#xff0c;形成了灵活且高性能的技术体系&#xff0c;其核心架构及技术特征可概括如下&#xff1a; 一、混合架构的典型模式 分层混合模式‌ 前端应用部署于公有云&#xff08;如渲染流化服务&#xff09;&#xff0c;后端逻辑…