SpringBoot框架—启动原理

news2025/4/18 12:30:19

1.@SpringBootApplication注解

在讲解启动原理之前先介绍一个非常重要的注解@SpringBootApplication,这个注解在Springboot程序的入口文件Application.java中必须添加。@SpringBootApplication是一个整合了三个核心注解的组合注解。

三个核心注解的作用机制

@SpringBootConfiguration:声明主类为配置类

@EnableAutoConfiguration:激活Springboot的自动配置机制,按条件加载自动配置类

@ComponentScan:组件扫描,自动扫描当前包及其子包下定义Bean的注解,如@Component,@Service,@Controller,然后将注解对应的类注册为Bean

三个注解共同协作,实现“约定优于配置”的原则

2.启动过程源码分析

2.1 SpringApplication类初始化

执行Main函数后,调用SpringApplication类实列化对象时,在SpringApplication构造函数中完成了以下操作:

  • 确定主配置类和扫描范围

Springboot通过注解@SpringBootApplication识别到主配置类,在构造函数中,判断主配置类如果不为空,保存主配置类

主配置类确定后,组件扫描的基准路径也就确定了。如果在入口文件中没有@ComponentScan显示指定扫描路径,则默认扫描主配置类所在包及其子包下的组件

如下面的代码,通过@ComponentScan显示指定扫描路径的同时,还通过scanBasePackageClasses显示指定了扫描起点

  • 推断项目类型

推断项目的类型可能为reactive、none、servlet三种类型,默认为servlet类型

  • 加载容器初始化类

从META-INF/spring.factories加载所有ApplicationContextInitializer实现类。

  • 初始化监听器

从META-INF/spring.factories加载所有ApplicationListener实现类

  • 推断主启动类

通过分析调用栈找到第一个包含main方法的类,通常和主配置类是一个类

2.2 加载外部配置文件

执行SpringApplication.run()后进入public ConfigurableApplicationContext run(String... args) {...},启动监听后开始加载配置文件的配置信息存放在Environment对象中

Springboot外部配置文件主要包含application.properties 和application.yml文件,这些文件中通常会指定启动端口号、数据库连接信息,公共属性,如服务url、公共账号等。加载顺序为:properties>yml>yaml,如果不同文件存在同名配置时,后加载的文件会覆盖先加载文件的同名配置。

2.3 创建Ioc容器

创建Spring应用上下文context,Spring应用上下文本质上就是一个Ioc容器

2.4 容器刷新前准备

源码入口如下:

在容器准备阶段完成了以下操作:

  • 将2.2中存储了外部配置文件、命令行参数、JVM参数的Environment加载到容器中
  • 注册核心单例Bean:SpringApplication实例本身、ApplicationArguments、Banner
  • 调用容器初始化类:执行2.1中从META-INF/spring.factories加载的所有ApplicationContextInitializer实现类
  • 加载主配置类到容器中:为后续的组件扫描和自动配置做准备
  • 触发ApplicationPreparedEvent事件,通知所有监听器容器已准备就绪

2.5 容器刷新

源码入口如下:

这一步是Springboot的启动核心,在这一步完成了很多重要的操作,具体如下:

  • 创建BeanFactory

BeanFactory是Springboot中最核心的接口之一,负责管理和创建Bean对象

  • 注册配置类

将Springboot的主配置类和其他配置类加载进BeanFactory中

  • 扫描组件,注册Bean

@ComponentScan自动扫描项目中被@Component及派生注解@Service、 @Controller、  @Repository、@RestController标记的类,并自动将这些注解标记的类解析为BeanDefinition,然后在注册到BeanDefinitionRegistry中。

  • 解析配置类

在解析配置类时,如果类中有@Bean标记的类,则会将这些类先解析为BeanDefinition并注册到BeanDefinitionRegistry中。

  • 启动自动配置机制

ConfigurationClassPostProcessor在此阶段开始解析@SpringBootApplication中的@EnableAutoConfiguration,触发AutoConfigurationImportSelector加载META-INF/spring.factories中定义的自动配置类。但不是所有配置类都会生效,而是由条件化装配机制来决定哪些自动配置类会生效,这一机制通过@Conditional系列注解来实现,然后在按照优先级顺序进行配置:显式定义的Bean>自动配置的Bean

比如说如果我们的应用是servlet类型,那会去找这些类

这些类文件在org.springframework.boot.autoconfigure文件夹里

  • 注册Bean后置处理器

从BeanFactory中扫描所有实现了BeanPostProcessor (Bean后置处理器) 接口的BeanDefinition,按照优先级顺序实例化并注册这些后置处理器,BeanPostProcessor会参与后续Bean的创建、初始化及依赖注入过程

  • 创建Tomcat 服务器实例

在onRefresh()中调用createWebServer()创建Tomcat 服务器实例,绑定端口,但未启动

  • 注册和初始化事件监听器

为后续监听容器刷新完成事件,应用启动完成事件做准备

  • 实例化Bean

遍历BeanFactory中注册的所有Bean定义,完成所有非懒加载单例Bean的实列化。

代码:BeanFactory调用createBeanInstance()方法

  • 依赖注入

解析Bean之间的依赖关系,自动注入@Autowired、@Resource等标记的依赖

  • 初始化Bean

对Bean进行自定义配置,完成最终的配置,使Bean达到可用的状态

代码:BeanFactory实现InitializingBean接口的afterPropertiesSet()方法

  • 启动tomcat服务器

启动tomcat服务器,发布容器刷新完成事件ContextRefreshedEvent,标志容器完全就绪

2.6 启动收尾

源码如下:

Springboot启动的最后阶段完成以下操作:

  • 停止启动计时器
  • 发布ApplicationStartedEvent,通知所有监听器Springboot应用已启动但未完全就绪
  • 执行所有Runners:先执行所有ApplicationRunner,在执行所有CommandLineRunner
  • 发布ApplicationReadyEvent,通知所有监听器Springboot应用完全就绪

3.启动原理总结

根据第2大点启动源码分析,启动原理可以概括为:

SpringBoot基于”约定优于配置“的核心设计原则,通过约定的注解@SpringBootApplication确定了主配置类,在通过@SpringBootApplication中的@ComponentScan完成约定的组件扫描,并自动将这些注解标记的类完成注册Bean,在通过@SpringBootApplication中的@EnableAutoConfiguration触发自动配置,使用“条件化装配机制”实现按需配置,最后实例化和初始化Bean,启动内嵌服务器,最终完成SpringBoot应用的启动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332572.html

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

相关文章

怎么检查网站CDN缓存是否生效

为什么要使用CDN缓存? 网站使用缓存可显著提升加载速度,减少服务器负载和带宽消耗,优化用户体验,增强架构稳定性,助力SEO优化,实现资源高效利用与性能平衡。 通过合理配置 CDN 缓存策略,可降低…

【自然语言处理】深度学习中文本分类实现

文本分类是NLP中最基础也是应用最广泛的任务之一,从无用的邮件过滤到情感分析,从新闻分类到智能客服,都离不开高效准确的文本分类技术。本文将带您全面了解文本分类的技术演进,从传统机器学习到深度学习,手把手实现一套…

vba讲excel转换为word

VBA将excel转换为word Sub ExportToWordFormatted() 声明变量Dim ws As Worksheet 用于存储当前活动的工作表Dim rng As Range 用于存储工作表的使用范围(即所有有数据的单元格)Dim rowCount As Long, colCount As Long 用于存储数据范围的行数和列数…

ubuntu安装openWebUI和Dify【自用详细版】

系统版本:ubuntu24.04LTS 显卡:4090 48G 前期准备 先安装好docker和docker-compose,可以参考我之前文章安装: ubuntu安装docker和docker-compose【简单详细版】 安装openWebUI 先docker下载ollama docker pull ghcr.nju.edu.c…

基于Flask的勒索病毒应急响应平台架构设计与实践

基于Flask的勒索病毒应急响应平台架构设计与实践 序言:安全工程师的防御视角 作为从业十年的网络安全工程师,我深刻理解勒索病毒防御的黄金时间法则——应急响应速度每提升1分钟,数据恢复成功率将提高17%。本文介绍的应急响应平台&#xff…

spark数据清洗案例:流量统计

一、项目背景 在互联网时代,流量数据是反映用户行为和业务状况的重要指标。通过对流量数据进行准确统计和分析,企业可以了解用户的访问习惯、业务的热门程度等,从而为决策提供有力支持。然而,原始的流量数据往往存在格式不规范、…

list的使用以及模拟实现

本章目标 1.list的使用 2.list的模拟实现 1.list的使用 在stl中list是一个链表,并且是一个双向带头循环链表,这种结构的链表是最优结构. 因为它的实现上也是一块线性空间,它的使用上是与string和vector类似的.但相对的因为底层物理结构上它并不像vector是线性连续的,它并没有…

【今日三题】小乐乐改数字 (模拟) / 十字爆破 (预处理+模拟) / 比那名居的桃子 (滑窗 / 前缀和)

⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 小乐乐改数字 (模拟)十字爆破 (预处理模拟)比那名居的桃子 (滑窗 / 前缀和) 小乐乐改数字 (模拟) 小乐乐改数字…

基于 Qt 的图片处理工具开发(一):拖拽加载与基础图像处理功能实现

一、引言 在桌面应用开发中,图片处理工具的核心挑战在于用户交互的流畅性和异常处理的健壮性。本文以 Qt为框架,深度解析如何实现一个支持拖拽加载、亮度调节、角度旋转的图片处理工具。通过严谨的文件格式校验、分层的架构设计和用户友好的交互逻辑&am…

44、Spring Boot 详细讲义(一)

Spring Boot 详细讲义 目录 Spring Boot 简介Spring Boot 快速入门Spring Boot 核心功能Spring Boot 技术栈与集成Spring Boot 高级主题Spring Boot 项目实战Spring Boot 最佳实践总结 一、Spring Boot 简介 1. Spring Boot 概念和核心特点 1.1、什么是 Spring Boot&#…

虽然理解git命令,但是我选择vscode插件!

文章目录 2025/3/11 补充一个项目一个窗口基本操作注意 tag合并冲突已有远程,新加远程仓库切换分支stash 只要了解 git 的小伙伴,应该都很熟悉这些指令: git init – 初始化git仓库git add – 把文件添加到仓库git commit – 把文件提交到仓库…

idea 打不开terminal

IDEA更新到2024.3后Terminal终端打不开的问题_idea terminal打不开-CSDN博客

【JVM】JVM调优实战

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…

FPGA_DDR(二)

在下板的时候遇到问题 1:在写一包数据后再读,再写再读 这时候读无法读出 查看时axi_arready没有拉高 原因 : 由于读地址后没有拉高rready,导致数据没有读出卡死现象。 解决结果

【吾爱出品】[Windows] 鼠标或键盘可自定义可同时多按键连点工具

[Windows] 鼠标或键盘连点工具 链接:https://pan.xunlei.com/s/VONSFKLNpyVDeYEmOCBY3WZJA1?pwduik5# [Windows] 鼠标或键盘可自定义可同时多按键连点工具 就是个连点工具,功能如图所示,本人系统win11其他系统未做测试,自己玩…

vue3实战一、管理系统之实战立项

目录 管理系统之实战立项对应相关文章链接入口:实战效果登录页:动态菜单:动态按钮权限白天黑夜模式:全屏退出全屏退出登录:菜单收缩: 管理系统之实战立项 vue3实战一、管理系统之实战立项:这个项…

设计模式 Day 6:深入讲透观察者模式(真实场景 + 回调机制 + 高级理解)

观察者模式(Observer Pattern)是一种设计结构中最实用、最常见的行为模式之一。它的魅力不仅在于简洁的“一对多”事件推送能力,更在于它的解耦能力、模块协作设计、实时响应能力。 本篇作为 Day 6,将带你从理论、底层机制到真实…

汽车软件开发常用的需求管理工具汇总

目录 往期推荐 DOORS(IBM ) 行业应用企业: 应用背景: 主要特点: Polarion ALM(Siemens) 行业应用企业: 应用背景: 主要特点: Codebeamer ALM&#x…

AI 越狱技术剖析:原理、影响与防范

一、AI 越狱技术概述 AI 越狱是指通过特定技术手段,绕过人工智能模型(尤其是大型语言模型)的安全防护机制,使其生成通常被禁止的内容。这种行为类似于传统计算机系统中的“越狱”,旨在突破模型的限制,以实…

推荐一款Nginx图形化管理工具: NginxWebUI

Nginx Web UI是一款专为Nginx设计的图形化管理工具,旨在简化Nginx的配置与管理过程,提高开发者和系统管理的工作效率。项目地址:https://github.com/cym1102/nginxWebUI 。 一、Nginx WebUI的主要特点 简化配置:通过图形化的界…