Spring Boot 完整流程

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


1. 从 main 方法开始

复制代码
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        https://zhida.zhihu.com/search?content_id=273940791&content_type=Article&match_order=1&q=SpringApplication&zhida_source=entity.run(Application.class, args);
    }
}

启动流程

复制代码
启动 Spring Boot
↓
创建 SpringApplication 对象
↓
判断项目类型(普通 / Web / Reactive)
↓
准备 Environment
↓
创建 ApplicationContext
↓
加载 https://zhida.zhihu.com/search?content_id=273940791&content_type=Article&match_order=1&q=BeanDefinition&zhida_source=entity
↓
实例化 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️⃣ 自动装配

例如:


8. 自动装配流程

复制代码
@EnableAutoConfiguration
↓
https://zhida.zhihu.com/search?content_id=273940791&content_type=Article&match_order=1&q=AutoConfigurationImportSelector&zhida_source=entity
↓
读取自动配置类
↓
加载 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 处理请求。
相关推荐
二哈赛车手6 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~6 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8297 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
candyTong8 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
未若君雅裁8 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
GetcharZp9 小时前
GitHub 2.4 万 Star!D2 正在重新定义程序员画图方式
后端
阿维的博客日记9 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI9 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding10 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构