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 处理请求。
相关推荐
WeiXin_DZbishe13 分钟前
基于springboot装修风格选择系统的设计与开发-计算机毕设【课程设计】77964
java·vue.js·spring boot·后端·python·php·课程设计
XZ-07000119 分钟前
week9-三元表达式
java·前端·python
leikooo20 分钟前
ARTS 1018: 字符计数判断异位词、局部做对仍会增加维护负担与用 AI 也要理解自己在做什么
后端
一步一脚印15626 分钟前
对于JVM的简单理解 一
后端
云和数据.ChenGuang29 分钟前
name=“张三“ age=18 weight=100.3 print (name,age,weight)
java·服务器·前端
1360967572341 分钟前
证书签不下来,是因为 well-known 被反代了
后端
Yeswater1 小时前
从 NIO 到 Netty:五个坑,和一张把它填平的基础设施网
java·后端·netty
福大大架构师每日一题1 小时前
2026-10-18:转换字符串的最小成本Ⅲ。用go语言,给定两个字符串 source 和 target,以及若干条替换规则。每条规则包含一个模式串、一个替换串
后端
韩振方1 小时前
Kubernetes Secret 让数据库密码离开镜像和 Pod 配置
后端
闽林致远1 小时前
基于标准 C++ 的插件化多线程通用数据采集框架|支持自定义业务模块,Oracle/MySQL 入库、FTP 图片上传,Windows/Linux 跨平台部署
后端