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/test5. ApplicationContext(容器)
常见类型:
- 普通:
AnnotationConfigApplicationContext - Web:
AnnotationConfigServletWebServerApplicationContext
核心组件:
BeanFactory(真正创建 Bean)6. BeanDefinition(Bean 图纸)
@Service public class UserService {}会被解析为:
beanName = userService beanClass = UserService scope = singleton👉 先有“图纸”,再创建对象
7. Bean 来源
1️⃣ 自定义组件
@Service2️⃣ @Bean 方法
@Bean public RestTemplate restTemplate() {}3️⃣ 自动装配
例如:
- DispatcherServlet
- RedisTemplate
- DataSource
8. 自动装配流程
@EnableAutoConfiguration ↓ AutoConfigurationImportSelector ↓ 读取自动配置类 ↓ 加载 xxxAutoConfiguration ↓ @Conditional 判断 ↓ 注册 BeanDefinition9. @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 ↓ 返回 JSON17. 内嵌 Tomcat
依赖:
spring-boot-starter-web自动创建:
TomcatServletWebServerFactory18. 数据库自动装配
依赖:
spring-boot-starter-jdbc自动创建:
- DataSource
- JdbcTemplate
- TransactionManager
19. Redis 自动装配
依赖:
spring-boot-starter-data-redis自动创建:
- RedisTemplate
- StringRedisTemplate
20. 配置绑定
application.yml ↓ Environment ↓ @ConfigurationProperties ↓ 属性类 ↓ 创建 Bean21. 启动完成后
执行:
- 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 处理请求。