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: 8080spring:
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
↓
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 处理请求。