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 处理请求。
相关推荐
IT_陈寒3 小时前
Java中equals方法比了个寂寞?原来这才是正确的重写姿势
前端·人工智能·后端
Thneonl3 小时前
Celery 生产踩坑:1000 任务积压与 acks_late 双重执行
后端·python
卷福同学3 小时前
第一次当面试官有感
后端·面试
苏三说技术3 小时前
为什么越来越多人用 OnlyOffice?
后端
IT枫斗者枫哥3 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
知守观3 小时前
@Transactional 事务失效排查,try-catch 吞异常导致回滚失败(附源码分析)
后端·spring
羑悻3 小时前
Codex + Seed-2.1-pro 实测:多模态理解 + Coding Agent 能扛住真实仓库吗?
后端
代码方舟3 小时前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
颜进强3 小时前
14 · NestJS ExecutionContext 执行上下文:守卫、拦截器、过滤器拿到的"同一个 context",为什么能力不一样?
前端·后端·ai编程
小小张说故事3 小时前
Python 多线程为什么跑不快?asyncio 入门指南:异步并发从零上手
后端·python