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 处理请求。
相关推荐
空中海1 小时前
第二章:Maven进阶篇 — 依赖管理与构建生命周期
java·maven
Mr.Rice.Fool1 小时前
rust面试经验1
后端·面试·职场和发展·rust
xun-ming2 小时前
AI时代Java程序员自救手册
java·开发语言·人工智能
DavidSoCool2 小时前
GB28181 PTZCmd 完整指令对照表(8 位 16 进制)+ 详细注释 + 使用说明
java·sip·gb28181
张健11564096482 小时前
C++访问控制与友元
java·开发语言·c++
Sam_Deep_Thinking2 小时前
中小团队需要一个资源微服务
java·微服务·架构
Thanks_ks2 小时前
透过 Copy-On-Write 机制:理解并发编程中的性能与一致性权衡
java·多线程·并发编程·底层原理·写时复制·copyonwrite·性能优
小鲁蛋儿2 小时前
Dynamic + ShardingSphere整合
spring boot·shardingsphere·dynamic
一只幸运猫.2 小时前
JAVA后端面试题
java·开发语言