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

Spring Boot 启动流程及配置类解析原理

Spring Boot 是一个基于 Spring 框架的开源框架,旨在简化 Spring 应用的配置和部署。通过提供约定优于配置的原则,Spring Boot 大大降低了 Java 企业级应用的开发复杂度。本文将详细介绍 Spring Boot 的启动流程及其配置类的解析原理,帮助开发者深入理解 Spring Boot 的工作机制。

一、Spring Boot 启动流程

1.1 启动入口

Spring Boot 应用的启动入口通常是一个带有 main 方法的类,该类被注解为 @SpringBootApplication。该注解实际上是一个复合注解,包含了以下三个注解:

  • @Configuration:指示该类是一个 Spring 配置类。
  • @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。
  • @ComponentScan:启用组件扫描,以自动发现并注册 Spring 组件。

以下是一个简单的 Spring Boot 启动类示例:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
​

1.2 SpringApplication 的启动过程

main 方法中,调用了 SpringApplication.run() 方法,该方法是 Spring Boot 应用启动的核心。其主要流程如下:

  1. 创建 SpringApplication 实例
    SpringApplication 是启动 Spring Boot 应用的核心类。它负责启动应用的上下文,并执行所有必要的初始化步骤。

    SpringApplication application = new SpringApplication(MyApplication.class);
    ​
    
  2. 准备上下文
    run 方法中,首先会准备一个 ApplicationContext(默认是 AnnotationConfigApplicationContextWebApplicationContext),并将主类传入。

  3. 加载配置
    根据 @SpringBootApplication 中的设置,加载应用的配置文件(如 application.propertiesapplication.yml),并将其转化为配置属性。

  4. 执行自动配置
    通过 @EnableAutoConfiguration 注解,Spring Boot 会自动装配必要的组件。例如,如果存在数据库驱动,则自动配置 DataSource

  5. 启动应用上下文
    启动 ApplicationContext,完成 Bean 的初始化和依赖注入。

  6. 触发 ApplicationRunner 和 CommandLineRunner
    如果定义了 ApplicationRunnerCommandLineRunner 接口的实现类,Spring Boot 会在应用启动后自动调用它们。

1.3 SpringApplication.run() 的关键步骤

以下是 SpringApplication.run() 方法中的关键步骤详细解析:

public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {SpringApplication application = new SpringApplication(primarySource);return application.run(args);
}
​
  1. 构造 SpringApplication 实例
    primarySource 是启动类,用于加载上下文。
  2. 准备环境
    调用 prepareEnvironment() 方法,设置应用的环境(如 EnvironmentApplicationArguments)。
  3. 创建应用上下文
    调用 createApplicationContext() 方法,根据应用类型创建相应的 ApplicationContext
  4. 准备上下文
    调用 prepareContext() 方法,配置上下文的属性和 Bean。
  5. 刷新上下文
    调用 refreshContext() 方法,初始化和刷新上下文。
  6. 调用应用的生命周期事件
    触发 ApplicationStartedEventApplicationReadyEvent 事件。

1.4 事件机制

在 Spring Boot 启动过程中,会触发多个事件,例如 ApplicationStartedEventApplicationEnvironmentPreparedEventApplicationReadyEvent。开发者可以通过实现 ApplicationListener 接口来监听这些事件。

二、Spring Boot 配置类解析原理

2.1 配置类的定义

在 Spring Boot 中,配置类通常是使用 @Configuration 注解标记的类。这些类用于定义 Bean,进行依赖注入和其他配置信息。以下是一个配置类的示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfig {@Beanpublic MyService myService() {return new MyService();}
}
​

2.2 配置类的解析过程

当 Spring Boot 启动时,配置类的解析过程主要涉及以下步骤:

  1. 组件扫描
    @SpringBootApplication 注解的类中,会进行组件扫描,寻找所有的 @Configuration 注解。
  2. 创建 ConfigurationClassParser 实例
    ConfigurationClassParser 是解析配置类的核心类,负责分析和处理所有的配置类。
  3. 解析配置类
    ConfigurationClassParser 会解析配置类中的 @Bean 方法,并生成相应的 BeanDefinition。
  4. 注册 BeanDefinition
    将解析得到的 BeanDefinition 注册到 BeanDefinitionRegistry 中,供后续使用。

2.3 Bean 的创建与注入

当需要使用某个 Bean 时,Spring 容器会根据 BeanDefinition 创建 Bean 实例,并进行依赖注入。

  1. 获取 BeanDefinition
    在调用 Bean 的时候,Spring 会从 ApplicationContext 中获取对应的 BeanDefinition。
  2. 实例化 Bean
    使用 BeanFactory 中的 doGetBean() 方法,创建 Bean 实例。
  3. 依赖注入
    Spring 会自动识别 Bean 的依赖关系,进行依赖注入。

2.4 注解的作用

在配置类中,常用的注解包括:

  • @Bean:用于定义 Bean 方法,返回的对象将被注册为 Spring 的 Bean。
  • @Configuration:标识配置类,表示该类可以包含多个 @Bean 方法。
  • @Conditional:用于条件化 Bean 的创建,根据条件决定是否创建 Bean。

相关文章:

Spring Boot 启动流程及配置类解析原理

Spring Boot 是一个基于 Spring 框架的开源框架&#xff0c;旨在简化 Spring 应用的配置和部署。通过提供约定优于配置的原则&#xff0c;Spring Boot 大大降低了 Java 企业级应用的开发复杂度。本文将详细介绍 Spring Boot 的启动流程及其配置类的解析原理&#xff0c;帮助开发…...

Vehicle HAL(5)--vhal 实现设置属性的流程

目录 1. ard11 vhal 设置属性的时序图 CarService > vhal > CarService 2. EmulatedVehicleHal::set(xxx) 的实现 本文介绍ard11的vhal属性设置流程图。 1. ard11 vhal 设置属性的时序图 CarService > vhal > CarService 2. EmulatedVehicleHal::set(xxx) 的实现…...

WebRTC中的几个Rtp*Sender

一、问题&#xff1a; webrtc当中有几个比较相似的类&#xff0c;看着都是发送RTP数据包的&#xff0c;分别是&#xff1a;RtpPacketToSend 和RtpSenderVideo还有RtpVideoSender以及RTPSender&#xff0c;这说明什么呢&#xff1f;首先&#xff0c;说明我会很多连词&#xff0…...

代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、栈与队列总结

150. 逆波兰表达式求值--后缀表达式 力扣题目链接(opens new window) 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给…...

Java编程课(一)

Java编程课 一、java简介二、Java基础语法2.1 环境搭建2.2 使用Intellij IDEA新建java项目2.3 Java运行介绍2.4 参数说明2.5 Java基础语法2.6 注释2.7 变量和常量一、java简介 Java是一种广泛使用的高级编程语言,最初由Sun Microsystems于1995年发布。它被设计为具有简单、可…...

IDEA202403 设置主题和护眼色

文章目录 背景一、设置主题二、设置背景豆沙绿三、设置控制台颜色 背景 在用IDEA进行开发时&#xff0c;长时间对着屏幕&#xff0c;不费眼是及其重要 一、设置主题 默认的主题是 Dark 暗黑&#xff0c;可更改为其他&#xff0c;如Light 高亮 位置&#xff1a;编辑栏【files…...

无人机螺旋桨平衡方法详解

螺旋桨平衡对于优化无人机性能、可靠性和使用寿命至关重要。不平衡的螺旋桨会产生过度振动&#xff0c;导致推力效率降低、噪音增大&#xff0c;并加速轴承和传感器的磨损。 螺旋桨平衡可通过三种方式实现&#xff1a;静态平衡、动态平衡和气动平衡。 静态与动态平衡是通过在…...

VUE混合开发用哪个PHP框架好?

在 Vue.js 主导前端的混合开发浪潮中&#xff0c;一个强大、灵活的后端 API 提供者至关重要。PHP 作为经久不衰的服务器端语言&#xff0c;拥有众多优秀框架。但哪个才是 Vue 混合开发的黄金搭档&#xff1f;本文将深入分析主流 PHP 框架的优劣&#xff0c;帮你找到最适合的那个…...

基于51单片机的车内防窒息检测报警系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体实现功能&#xff1a; &#xff08;1&#xff09;检测车内温度及二氧化碳浓度并用lcd1602实时显示。 &#xff08;2&#xff09;当人体红外传感器检测到车内有人&#xff0c;且温度或二氧化碳浓度…...

Flask-Babel 使用示例

下面创建一个简单的 Flask-Babel 示例&#xff0c;展示如何在 Flask 应用中实现国际化和本地化功能。这个示例将包括多语言支持&#xff08;中文和英文&#xff09;、语言切换功能以及翻译文本的使用。 项目结构 我们将创建以下文件结构&#xff1a; 1. 首先&#xff0c;创…...

Android 轻松实现 增强版灵活的 滑动式表格视图

表格视图组件&#xff0c;支持&#xff1a; 1. 无标题模式&#xff1a;只有数据行也可以正常滑动 2. 两种滑动模式&#xff1a;固定第一列 或 全部滑动 3. 全面的样式自定义能力 4. 智能列宽计算 1. 无标题模式支持 设置无标题&#xff1a;调用 setHeaderData(null) 或 …...

寄存器模型生成:从手工到自动化

写代码这件事&#xff0c;总是充满了矛盾。你想要完美控制每一个细节&#xff0c;但又希望能够批量生产。寄存器模型的生成&#xff0c;恰恰体现了这种矛盾。 手工编写的局限性 我们完全可以手工编写一个寄存器模型。代码写出来&#xff0c;功能也能实现&#xff0c;看起来一切…...

国标GB28181视频平台EasyGBS视频实时监控系统打造换热站全景可视化管理方案

一、方案背景​ 在城市供热体系中&#xff0c;换热站作为连接热源与用户的核心枢纽&#xff0c;其运行稳定性直接影响供热质量。面对供热规模扩大与需求升级&#xff0c;传统人工巡检模式暴露出效率低、响应慢、监测不足等问题。基于GB28181协议的EasyGBS视频实时监控系统&…...

docker生命周期

进入容器里面 docker pull ubuntu # 获取ubtuntu镜像 docker run ubtuntu # -i 交互式命令操作&#xff0c;-t 开启一个终端 bash 进入容器后&#xff0c;执行的命令 docker run -it ubtuntu bash...

鸿蒙缺少WMIC missing WMIC

在DecEco Studio中选择模拟器的时候会弹出“可能会导致设备管理功能失效。请检查并安装 WMIC”。 在启动鸿蒙模拟器时报&#xff1a;missing WMIC missing WMIC lt may cause the device management function to fail. Please check and install WMIC. 解决方案&#xff1a…...

25.6.5学习总结

归并排序&#xff08;Merge Sort&#xff09; 1. 概述 归并排序是一种基于分治思想的排序算法。它通过递归的方式&#xff0c;将待排序的数组不断分割成两半&#xff0c;直到每个子数组只剩一个元素&#xff08;自然排序&#xff09;&#xff1b;然后&#xff0c;将这些子数组…...

Spring Boot 使用 SLF4J 实现控制台输出与分类日志文件管理

概述 在日常的 Java 项目开发中&#xff0c;日志是最重要的调试与排查手段之一。为了便于开发时实时查看&#xff0c;同时在生产中追踪问题&#xff0c;我们通常希望实现以下日志管理目标&#xff1a; ✅ 控制台实时输出日志&#xff0c;方便开发调试✅ 日志根据级别分类保存…...

linux_centos7.x的ifconfig命令显示内容详解

这是一段在Linux系统中执行 ifconfig 命令后得到的网络接口信息输出。ifconfig 命令用于显示或配置网络接口的参数。以下是对输出中各个网络接口信息的详细解释&#xff1a; 1. ens33 接口 ​​状态标志​​&#xff1a;flags4163<UP,BROADCAST,RUNNING,MULTICAST> 表示…...

CentOS 7 如何pip3安装pyaudio?

CentOS 7 如何pip3安装pyaudio&#xff1f; # 先将yum软件源改为阿里云镜像源 http://mirrors.aliyun.com/centos-vault/7.9.2009/ bash <(curl -sSL https://linuxmirrors.cn/main.sh) # 基于一键换源脚本&#xff0c;全部回车即可# pip3安装模块是从源码构建&#xff08;…...

6.5本日总结

一、英语 复习默写list8list21&#xff0c;订正翻译07年第二篇阅读 二、数学 学习线代第一讲 三、408 学习计组2.2&#xff0c;写计组习题 四、总结 这篇阅读全对&#xff0c;整体题目不算难&#xff0c;但是对文意的翻译差点&#xff0c;后续要多练习句子翻译 五、明日…...

【个人笔记】数据库原理(西电)

第一章 ER图和关系分解见课本p69 ER图是常用的 概念模型 方形&#xff1a;实体圆形&#xff1a;属性菱形&#xff1a;关系 常用的逻辑模型 说白了&#xff1a;增删改查 几种数据模型的基本概念 层次模型&#xff1a;树状结构【只能处理一对多的关系&#xff0c;只有沿着从根…...

嵌入式学习之系统编程(十)网络编程之TCP传输控制协议

目录 一、网络模型 1、服务器/客户端模型 2、C/S与B/S区别 3、P2P模型 二、TCP&#xff08;传输控制协议&#xff09; &#xff08;一&#xff09;TCP概述 &#xff08;二&#xff09;TCP的特征&#xff08;面问高频问题&#xff09; 1、有链接 三次握手&#xff1a;建…...

【react+antd+vite】优雅的引入svg和阿里巴巴图标

1.安装相关包 由于是vite项目&#xff0c;要安装插件来帮助svg文件引入进来&#xff0c;否则会失败 npm下载包 npm i vite-plugin-svgr vite.config.ts文件内&#xff1a; import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …...

3D动画在微信小程序的实现方法

微信小程序支持通过多种方式实现3D动画效果&#xff0c;主要包括使用CSS3、WebGL及第三方库。以下为具体方法&#xff1a; 一. 使用CSS3 Transform实现基础3D动画详解 CSS3的transform属性提供了强大的2D/3D变换功能&#xff0c;通过简单的代码就能实现复杂的视觉效果。在小程…...

计算机网络 | 1.2 计算机网络体系结构与参考模型

计算机网络体系结构与参考模型 目录 计算机网络体系结构与参考模型 【思维导图】 1、计算机的分层结构 1、为什么要分层&#xff1f; 2、什么是计算机网络体系结构 2、计算机网络协议、接口和服务 1&#xff09;协议&#xff1a; 2&#xff09;接口&#xff1a; 3…...

网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件

目录 网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件网心云 OEC/OECT 笔记(2) 运行RKNN程序 外观 内部 PCB正面 PCB背面 PCB背面 RK3566 1Gbps PHY 配置 OEC 和 OECT(OEC-turbo) 都是基于瑞芯微 RK3566/RK3568 的网络盒子, 没有HDMI输入输出. 硬件上 OEC 和 OECT…...

【Web应用】若依框架:基础篇17二次开发-项目名称修改-新建业务模块

文章目录 ⭐前言⭐一、课程讲解⭐二、自己手动实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数据库、操作系统、大数据、人工智能、工控、网络、…...

C获取unix操作系统的信息

在 C 语言中获取 Linux 操作系统的架构类型(如 x86_64)、系统位数(32/64位)、内核信息等,可以通过多种方式实现。下面是几种常见的方法: ✅ 方法一:使用 uname 获取系统信息 #include <stdio.h> #include <sys/utsname.h>int main(...

MQTT入门实战宝典:从零起步掌握物联网核心通信协议

MQTT入门实战宝典&#xff1a;从零起步掌握物联网核心通信协议 前言 物联网时代&#xff0c;万物互联已成为现实&#xff0c;而MQTT协议作为这个时代的"数据总线"&#xff0c;正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开MQTT的神秘面纱&#…...

05【Linux经典命令】Linux 用户管理全面指南:从基础到高级操作

目录 前言 1 Linux用户管理基础概念 1.1 Linux用户类型 1.2 用户相关配置文件 1.3 UID与GID 2 用户创建与管理 2.1 创建用户 2.2 设置用户密码 3 用户权限管理 3.1 授予sudo权限 3.2 以其他用户身份执行命令 4 用户信息查询 4.1 查看用户基本信息 4.2 查看用户所…...