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

Spring Boot 完整流程

Spring Boot 启动后,会先创建 Spring 容器,然后加载配置、扫描类、自动装配、创建 Bean、完成依赖注入、执行初始化逻辑,最后启动 Web 服务器,对外提供接口服务。


1. 从 main 方法开始

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

启动流程

启动 Spring Boot ↓ 创建 SpringApplication 对象 ↓ 判断项目类型(普通 / Web / Reactive) ↓ 准备 Environment ↓ 创建 ApplicationContext ↓ 加载 BeanDefinition ↓ 实例化 Bean ↓ 依赖注入 ↓ 初始化 Bean ↓ 启动内嵌 Tomcat ↓ 项目启动完成

2. @SpringBootApplication 做了什么?

它是三个核心注解的组合:

@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan

本质作用

@SpringBootApplication ↓ 1. 标记配置类 2. 扫描组件 3. 开启自动装配

2.1 @SpringBootConfiguration

本质就是:

@Configuration

表示当前类是配置类,可以定义 Bean:

@Bean public UserService userService() { return new UserService(); }

2.2 @ComponentScan

负责扫描组件:

@Component @Service @Controller @Repository @RestController

默认扫描范围

启动类所在包 + 子包

2.3 @EnableAutoConfiguration

自动装配核心:

  • Spring Boot 2.x →spring.factories
  • Spring Boot 3.x →AutoConfiguration.imports

3. 启动核心流程

main ↓ SpringApplication.run() ↓ 创建 SpringApplication ↓ 准备 Environment ↓ 创建 ApplicationContext ↓ 加载 BeanDefinition ↓ BeanFactoryPostProcessor ↓ 实例化单例 Bean ↓ 依赖注入 ↓ Aware 回调 ↓ BeanPostProcessor 前置 ↓ 初始化 ↓ BeanPostProcessor 后置 ↓ 启动 Tomcat ↓ 发布启动事件

4. Environment(配置读取)

配置来源:

  • application.yml / properties
  • 命令行参数
  • 系统环境变量
  • JVM 参数
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/test

5. ApplicationContext(容器)

常见类型:

  • 普通:AnnotationConfigApplicationContext
  • Web:AnnotationConfigServletWebServerApplicationContext

核心组件:

BeanFactory(真正创建 Bean)

6. BeanDefinition(Bean 图纸)

@Service public class UserService {}

会被解析为:

beanName = userService beanClass = UserService scope = singleton

👉 先有“图纸”,再创建对象


7. Bean 来源

1️⃣ 自定义组件

@Service

2️⃣ @Bean 方法

@Bean public RestTemplate restTemplate() {}

3️⃣ 自动装配

例如:

  • DispatcherServlet
  • RedisTemplate
  • DataSource

8. 自动装配流程

@EnableAutoConfiguration ↓ AutoConfigurationImportSelector ↓ 读取自动配置类 ↓ 加载 xxxAutoConfiguration ↓ @Conditional 判断 ↓ 注册 BeanDefinition

9. @Conditional 作用

常见条件

@ConditionalOnClass @ConditionalOnMissingBean @ConditionalOnBean @ConditionalOnProperty @ConditionalOnWebApplication

👉 核心思想:

你没配 → 我帮你配 你配了 → 听你的

10. Bean 生命周期

BeanDefinition ↓ 实例化 ↓ 依赖注入 ↓ Aware 回调 ↓ 前置处理 ↓ 初始化 ↓ 后置处理 ↓ 可使用 ↓ 销毁

本质三步

1. 构造 2. 注入 3. 初始化

11. 依赖注入时机

new 对象 ↓ 依赖注入 ↓ 初始化

12. 三种注入方式

字段注入(不推荐)

@Autowired private UserService userService;

Setter 注入

@Autowired public void setUserService(UserService userService) {}

构造器注入(推荐)

public UserController(UserService userService) {}

13. Bean 查找规则

按类型 ↓ @Primary ↓ 变量名 ↓ @Qualifier ↓ 报错

14. BeanPostProcessor

Object postProcessBeforeInitialization(...) Object postProcessAfterInitialization(...)

👉 用于增强 Bean(AOP、事务等)


15. AOP 代理生成

发生在:

BeanPostProcessor 后置阶段

例如:

@Transactional

本质:

代理对象 + 方法增强

16. Web 请求流程

浏览器 ↓ Tomcat ↓ DispatcherServlet ↓ HandlerMapping ↓ HandlerAdapter ↓ Controller ↓ Service ↓ Mapper ↓ 返回 JSON

17. 内嵌 Tomcat

依赖:

spring-boot-starter-web

自动创建:

TomcatServletWebServerFactory

18. 数据库自动装配

依赖:

spring-boot-starter-jdbc

自动创建:

  • DataSource
  • JdbcTemplate
  • TransactionManager

19. Redis 自动装配

依赖:

spring-boot-starter-data-redis

自动创建:

  • RedisTemplate
  • StringRedisTemplate

20. 配置绑定

application.yml ↓ Environment ↓ @ConfigurationProperties ↓ 属性类 ↓ 创建 Bean

21. 启动完成后

执行:

  • CommandLineRunner
  • ApplicationRunner

22. 容器关闭

停止服务 ↓ 销毁 Bean ↓ @PreDestroy ↓ 释放资源

23. 总流程(终极版)

main ↓ SpringApplication.run() ↓ Environment ↓ ApplicationContext ↓ @ComponentScan ↓ @EnableAutoConfiguration ↓ @Conditional 判断 ↓ 注册 BeanDefinition ↓ 创建 Bean(实例化→注入→初始化→代理) ↓ 启动 Tomcat ↓ 接收请求 ↓ Controller → Service → Mapper ↓ 返回 JSON ↓ 关闭容器

🎯 面试总结(精简版)

Spring Boot 从 SpringApplication.run() 启动, 先创建环境和容器,然后扫描组件并加载自动配置类。 自动装配通过 AutoConfigurationImportSelector 加载配置类, 再通过 @Conditional 判断是否生效。 Bean 生命周期包括实例化、依赖注入、初始化和后置处理。 Web 项目会自动启动 Tomcat,并通过 DispatcherServlet 处理请求。
http://www.cnnetsun.cn/news/2159595.html

相关文章:

  • 终极跨平台键鼠共享指南:如何用Lan Mouse一套设备控制多台电脑?
  • 基础知识回顾
  • 客厅落地窗双层窗帘搭配方案实用款
  • 别再手动改注册表了!用Python的winreg模块批量修改软件配置(附实战代码)
  • 如何在Windows上直接安装APK文件:告别模拟器的终极轻量级解决方案
  • MIKE IO完整指南:5分钟掌握Python水文数据处理利器
  • KISSABC伴学 英语沉浸式伴学优势深度解析
  • Vue-Excel-Editor深度解析:重新定义Web表格编辑的技术范式
  • 如何替换SQL字符串字符_利用REPLACE函数进行批量清洗
  • uConsole模块化手持计算机:硬件解析与使用指南
  • 智能抠图助手有哪些?2026年最全工具测评与推荐指南
  • 避坑指南:用DRV8833和STM32驱动直流电机,这些PWM配置细节千万别搞错
  • NoFences终极指南:免费开源工具彻底解决Windows桌面混乱问题
  • Unity C#入门:脚本的生命周期函数详解(LateUpdate/OnDestroy)
  • 3步拯救你的B站缓存视频:从m4s格式到永久MP4备份的完整解决方案
  • Swoole HTTP Server 的本质的庖丁解牛
  • 如何用KeymouseGo快速实现鼠标键盘自动化?完整免费教程
  • AriaNg:如何为命令行下载工具打造现代化的Web控制界面?
  • 如何彻底解除Navicat试用期限制:macOS智能重置方案完整指南
  • R 4.5地理空间分析增强(仅限2024年6月前安装的用户可解锁的隐藏空间IO加速模式)
  • 游戏PBR材质自动生成:从低分辨率截图到次世代渲染
  • AOSP 本质解析:为什么 Android 是编译期 + 运行时的混合系统(系统篇)
  • 如何快速掌握B站视频下载:DownKyi完整配置使用指南
  • 中专学历,276人团队,年出货过亿颗芯片——这个南京老哥把CH340做成了全球嵌入式圈的“基础设施“
  • DS2API:Go语言实现的DeepSeek API代理,兼容OpenAI/Claude/Gemini协议
  • 八大网盘直链下载助手终极指南:一键获取真实地址告别限速烦恼
  • 【R核心开发组内部验证版】:R 4.5.0–4.5.2三阶段benchmark对比,这3项配置不改,并行效率永远卡在62%以下
  • AHB总线时序设计与多主设备仲裁机制详解
  • 二手极路由4刷OpenWrt变身‘超级无线网卡’:防ARP攻击+稳定获取IPv6全流程
  • 多GPU分布式SFT训练实战:Qwen2-7B调优指南