15
一、SpringBoot 启动流程原理
1. 执行 SpringApplication.run(),判断应用类型(Servlet/Reactive)
2. 通过 SpringFactoriesLoader 加载 META-INF/spring.factories 中的 SPI 扩展
3. 初始化 ApplicationContextInitializer 并执行回调
4. 加载自动配置类,通过 @Conditional 完成条件装配
5. 执行 BeanDefinition 注册、依赖注入与初始化
6. 执行 ApplicationRunner、CommandLineRunner
7. 启动内嵌 Web 容器,完成服务启动
核心原理:SPI 机制、条件装配、Bean 生命周期钩子、后置处理器
二、自动配置底层实现
@EnableAutoConfiguration 通过 @Import 导入 AutoConfigurationImportSelector
1. 读取 spring-boot-autoconfigure 中的自动配置类
2. 依据 @ConditionalOnClass、@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnProperty 等条件判断是否加载
3. 绑定 XxxProperties 读取配置文件,完成 Bean 自动注册
4. 可通过 exclude 或配置项排除指定自动配置
三、Bean 生命周期完整流程
实例化 → 属性填充 → Aware 接口回调 → BeanPostProcessor 前置处理 → @PostConstruct/InitializingBean → 初始化方法 → BeanPostProcessor 后置处理(AOP 代理生成)→ 成品 Bean → 容器关闭执行 @PreDestroy/DisposableBean
四、循环依赖与三级缓存
Spring 仅解决单例、Setter 注入的循环依赖
1. 一级缓存:singletonObjects 成品 Bean
2. 二级缓存:earlySingletonObjects 早期 Bean
3. 三级缓存:singletonFactories 延迟工厂,用于生成 AOP 代理
构造器注入、多例 Bean 无法解决循环依赖,会抛出 BeanCurrentlyInCreationException
五、Spring 事务原理与失效场景
基于 AOP 环绕通知 + TransactionInterceptor
1. 事务生效条件:public 方法、Spring 管理 Bean、外部调用、开启 @EnableTransactionManagement
2. 失效场景:非 public、final/static 方法、内部 this 调用、异常被捕获、非运行时异常未指定 rollbackFor、多线程调用、未被 Spring 管理
六、事务传播机制核心
REQUIRED:默认,加入当前事务,无则新建
REQUIRES_NEW:新建独立事务,挂起当前事务
NESTED:嵌套事务,基于保存点回滚,与父事务同提交同回滚
SUPPORTS:支持事务,无则非事务执行
NOT_SUPPORTED:非事务执行,挂起当前事务
MANDATORY:必须存在事务,否则抛异常
NEVER:必须非事务,否则抛异常
七、AOP 原理与失效场景
基于 JDK 动态代理(接口)或 CGLIB(类)代理
1. 代理对象在 Bean 初始化后生成
2. 失效场景:内部 this 调用、private/final 方法、static 方法、构造方法
3. 核心:目标方法必须由代理对象调用才会触发切面
八、内嵌容器启动原理
SpringBoot 通过 ServletWebServerFactory 自动配置 Tomcat/Jetty/Undertow
1. 自动配置 TomcatServletWebServerFactory
2. 启动时创建 Tomcat 实例,绑定端口与连接器
3. 可通过依赖排除切换容器,支持优雅停机与线程池调优
九、配置加载优先级
命令行参数 > 系统环境变量 > JVM 参数 > application-{profile}.yml > application.yml > 配置默认值
支持多环境切换、配置覆盖、外部配置文件加载
十、@Async 异步原理
1. 开启 @EnableAsync,基于 AOP 异步执行
2. 默认使用 SimpleAsyncTaskExecutor,推荐自定义 ThreadPoolTaskExecutor
3. 注意事项:异步方法不能与事务共用、线程上下文丢失、需 public 方法、不可内部调用
十一、SpringBoot 扩展机制
1. ApplicationContextInitializer:容器初始化前扩展
2. BeanFactoryPostProcessor:Bean 定义加载后扩展
3. BeanPostProcessor:Bean 初始化前后扩展
4. ImportBeanDefinitionRegistrar:手动注册 Bean
5. FactoryBean:工厂 Bean,用于创建复杂对象
十二、优雅停机实现
配置 server.shutdown=graceful
停机流程:停止接收新请求 → 等待请求处理完成 → 关闭容器 → 执行销毁方法
可结合 @PreDestroy、线程池关闭、消息队列断开保证安全停机
十三、Starter 自定义核心
1. 定义自动配置类与 XxxProperties
2. 编写 spring.factories 注册自动配置
3. 使用 @Conditional 完成条件装配
4. 打包为 starter 依赖,实现开箱即用
十四、SpringBoot 性能调优
1. 开启懒加载 spring.main.lazy-initialization=true
2. 优化 Tomcat 线程池、连接池参数
3. 使用 HikariCP 最优连接池配置
4. 关闭无用自动配置、减少 Bean 加载
5. JVM 堆、元空间、GC 策略调优
6. 开启 HTTP 连接复用与压缩

浙公网安备 33010602011771号