12
SpringBoot 高阶核心知识点深度解析(进阶+源码向)
一、SpringBoot 自动配置底层原理(核心难点)
自动配置是SpringBoot的灵魂,绝非简单的注解生效,而是基于SPI、条件注解、配置类加载的完整底层机制,核心拆解如下:
1. @SpringBootApplication 复合注解拆解
该注解是三合一组合:
- @SpringBootConfiguration :本质是 @Configuration ,标记为配置类,被Spring容器管理;
- @ComponentScan :默认扫描启动类同级及子包,完成Bean扫描;
- @EnableAutoConfiguration :自动配置核心注解,触发全量自动配置加载。
2. @EnableAutoConfiguration 底层SPI机制
该注解通过 @Import(AutoConfigurationImportSelector.class) 导入选择器,基于Java SPI(Service Provider Interface) 加载自动配置类: - 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(SpringBoot 2.7+),获取所有预定义的自动配置类(如DataSourceAutoConfiguration、WebMvcAutoConfiguration);
- 排除开发者配置的 exclude 类,过滤出需要加载的配置类。
3. 条件注解的精准匹配(@Conditional系列)
自动配置类并非全部加载,而是通过条件注解按需生效,高阶条件注解难点: - @ConditionalOnClass :类路径下存在指定类才加载配置(如存在RedisTemplate才加载Redis自动配置);
- @ConditionalOnMissingBean :容器中无指定Bean时才加载(保证开发者自定义Bean优先级更高);
- @ConditionalOnProperty :配置文件存在指定属性才生效;
- @ConditionalOnWebApplication :Web环境下才加载Web相关配置。
4. 自动配置的优先级与覆盖规则 - 开发者自定义Bean > 自动配置Bean( @ConditionalOnMissingBean 保证);
- 自动配置类通过 @AutoConfigureOrder 指定优先级,数值越小优先级越高;
- 配置文件 application.yml 优先级高于自动配置默认值,通过 @ConfigurationProperties 绑定覆盖。
二、SpringBoot 容器启动全流程(源码级难点)
SpringBoot启动并非简单运行 main 方法,而是SpringApplication.run() 分阶段执行的复杂流程,核心高阶步骤:
1. SpringApplication 实例化阶段
- 推断应用类型(REACTIVE、SERVLET、NONE);
- 加载 spring.factories 中的 ApplicationContextInitializer 、 ApplicationListener 初始化器和监听器;
- 推断主类(启动类)。
2. run() 方法核心执行流程 - 启动监听器(SpringApplicationRunListeners),广播启动事件;
- 准备环境(ConfigurableEnvironment),加载配置文件、系统属性、环境变量;
- 创建容器(ApplicationContext):根据应用类型创建 AnnotationConfigServletWebServerApplicationContext (Web环境);
- 初始化容器:执行 ApplicationContextInitializer ,扫描Bean、加载自动配置类;
- 刷新容器(refresh()):Spring核心方法,完成Bean的创建、依赖注入、初始化、AOP代理;
- 启动Web服务器(Tomcat/Jetty):通过 ServletWebServerFactory 创建服务器,绑定端口;
- 执行 ApplicationRunner 、 CommandLineRunner ,广播启动完成事件。
3. 启动失败的异常处理机制
SpringBoot通过 SpringBootExceptionReporter 处理启动异常,而非直接抛出,支持自定义异常报告器。
三、SpringBoot 事务管理高阶难点
SpringBoot事务基于Spring事务,传播行为、隔离级别、失效场景是核心难点,重点解析高阶内容:
1. 事务传播行为(7种,核心难点:REQUIRED、REQUIRES_NEW、NESTED)
- REQUIRED:默认级别,当前有事务则加入,无则新建;同类方法内调用不生效(代理机制导致);
- REQUIRES_NEW:新建独立事务,挂起当前事务,新事务提交/回滚不影响原事务;
- NESTED:嵌套事务,基于保存点(SavePoint)实现,子事务回滚仅回滚到保存点,父事务可继续执行;
- 禁止使用:SUPPORTS(无事务则非事务执行,易导致数据不一致)。
2. 事务隔离级别与脏读、幻读、不可重复读
SpringBoot支持5种隔离级别,默认使用数据库隔离级别(MySQL默认REPEATABLE READ): - READ_UNCOMMITTED:最低级别,允许脏读;
- READ_COMMITTED:解决脏读,允许不可重复读、幻读;
- REPEATABLE_READ:解决脏读、不可重复读,MySQL通过MVCC解决幻读;
- SERIALIZABLE:最高级别,串行执行,无并发问题但性能极差。
3. @Transactional 事务失效的8种高阶场景 - 同类方法内部调用(未经过Spring代理,如 a(){b()} ,b方法加事务不生效);
- 方法非public(Spring AOP基于动态代理,仅拦截public方法);
- 捕获异常未抛出(事务仅回滚RuntimeException/Error,捕获Exception不抛则不回滚);
- 调用private/final方法(无法被代理);
- 多线程调用(新线程脱离原事务上下文);
- 未被Spring管理(类未加@Service/@Component);
- 传播行为设置错误(如SUPPORTS无事务则非事务执行);
- 数据库不支持事务(如MyISAM引擎)。
四、SpringBoot 循环依赖解决方案(源码级难点)
循环依赖是Spring容器的经典难题,SpringBoot仅支持单例Bean的Setter循环依赖,高阶解析:
1. 循环依赖的触发条件
- 两个Bean互相注入(A依赖B,B依赖A);
- 非单例、构造器注入、多线程注入,无法解决。
2. 三级缓存底层原理(核心难点)
Spring通过三级缓存提前暴露半成品Bean,解决循环依赖: - 一级缓存(singletonObjects):存放完整的、初始化完成的单例Bean;
- 二级缓存(earlySingletonObjects):存放半成品Bean(已实例化,未填充属性、未初始化);
- 三级缓存(singletonFactories):存放Bean工厂,生成提前暴露的Bean(解决AOP代理循环依赖)。
3. 循环依赖的解决流程
实例化A → 放入三级缓存 → 填充属性B → 实例化B → 放入三级缓存 → 填充属性A → 从三级缓存获取A半成品 → B完成初始化 → A完成初始化。
4. 无法解决的循环依赖场景 - 构造器注入循环依赖(无三级缓存时机,实例化时就需要依赖Bean);
- 多例Bean(非单例不存入缓存);
- 原型作用域Bean;
- 被@Async修饰的Bean循环依赖。
五、SpringBoot 自定义Starter(高级封装难点)
自定义Starter是SpringBoot模块化、组件化的核心,区别于普通依赖,需遵循自动配置规范,高阶步骤:
1. Starter 命名规范
- 官方Starter:spring-boot-starter-xxx;
- 自定义Starter:xxx-spring-boot-starter(如redis-spring-boot-starter)。
2. 核心依赖与配置
引入 spring-boot-autoconfigure 、 spring-boot-configuration-processor (生成配置元信息)。
3. 自动配置类编写 - 用 @Configuration 标记配置类;
- 用 @Conditional 系列注解控制生效条件;
- 用 @Bean 定义核心组件;
- 用 @ConfigurationProperties 绑定配置文件属性。
4. SPI 注册自动配置类
在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中写入自定义自动配置类全类名,实现自动加载。
5. Starter 进阶:条件加载、配置提示、依赖管控 - 可选依赖:用
true 避免依赖传递; - 配置提示:编写 additional-spring-configuration-metadata.json ,让IDE提示配置属性;
- 版本管控:通过parent pom统一依赖版本。
六、SpringBoot 异步编程高阶难点
SpringBoot通过 @EnableAsync 、 @Async 实现异步,底层线程池、异常处理、事务隔离是难点:
1. @Async 底层原理
基于Spring AOP代理,异步方法被独立线程执行,脱离原线程上下文(原事务失效)。
2. 自定义线程池(核心)
默认使用 SimpleAsyncTaskExecutor (无上限线程,易OOM),需自定义 ThreadPoolTaskExecutor :
- 核心参数:corePoolSize(核心线程)、maxPoolSize(最大线程)、queueCapacity(队列容量)、keepAliveTime(空闲时间);
- 拒绝策略:CallerRunsPolicy(调用者执行)、AbortPolicy(抛出异常)等。
3. 异步方法的高阶问题 - 事务失效:异步方法在新线程,无原事务上下文,需单独加事务;
- 异常处理:实现 AsyncUncaughtExceptionHandler 捕获异步异常;
- 同类调用失效:同事务失效原理,未经过代理。
七、SpringBoot AOP 高阶难点
SpringBoot AOP基于动态代理(JDK动态代理+CGLIB),难点集中在代理机制、切点表达式、通知顺序:
1. 代理机制选择
- 目标类实现接口:默认JDK动态代理(基于接口);
- 目标类无接口:使用CGLIB代理(基于子类继承);
- SpringBoot 2.0+默认开启CGLIB代理( spring.aop.proxy-target-class=true )。
2. 切点表达式高阶语法 - execution(* com.xxx.service..(..)) :匹配service包下所有类的所有方法;
- @annotation(com.xxx.annotation.Log) :匹配标注自定义注解的方法;
- bean(*ServiceImpl) :匹配以ServiceImpl结尾的Bean。
3. AOP 通知执行顺序(难点)
正常执行:@Around前置 → @Before → 目标方法 → @Around后置 → @After → @AfterReturning;
异常执行:@Around前置 → @Before → 目标方法异常 → @Around异常 → @After → @AfterThrowing。
4. AOP 失效场景 - 同类内部方法调用(未经过代理);
- 方法为static/final/private;
- Bean未被Spring管理。
八、SpringBoot 配置绑定高阶难点
1. @ConfigurationProperties 与 @Value 区别
- @ConfigurationProperties :支持批量绑定、松散绑定(user-name=xxx 绑定userName)、JSR303校验、复杂类型(Map/List);
- @Value :仅单个属性绑定,不支持校验和松散绑定,不推荐用于批量配置。
2. 配置绑定的生效条件 - 配置类需加 @ConfigurationPropertiesScan (SpringBoot 2.2+)或 @EnableConfigurationProperties ;
- 引入 spring-boot-configuration-processor 生成配置元数据,否则IDE无提示。
3. 多环境配置优先级
命令行参数 > 配置中心 > application-{profile}.yml > application.yml > 自动配置默认值。
九、SpringBoot 内置Web服务器原理(Tomcat高阶)
SpringBoot默认内置Tomcat,自动配置、启动、关闭、参数调优是难点:
1. Tomcat 自动配置类
ServletWebServerFactoryAutoConfiguration → TomcatServletWebServerFactory ,自动创建Tomcat实例。
2. Tomcat 高阶参数调优
- 线程池:server.tomcat.threads.core(核心线程)、server.tomcat.threads.max(最大线程);
- 连接数:server.tomcat.max-connections(最大连接数)、accept-count(等待队列);
- 超时:server.tomcat.connection-timeout(连接超时)。
3. 切换Web服务器
排除Tomcat依赖,引入Jetty/Undertow依赖,SpringBoot自动切换( @ConditionalOnClass 生效)。
十、SpringBoot 监控与扩展(Actuator高阶)
Actuator是SpringBoot生产级监控组件,端点暴露、安全管控、自定义端点是难点:
1. 核心高阶端点
- /actuator/beans :查看容器所有Bean及依赖关系;
- /actuator/conditions :查看自动配置生效/失效条件;
- /actuator/env :查看环境配置;
- /actuator/refresh :动态刷新配置(配合配置中心)。
2. 自定义Actuator端点
通过 @Endpoint 、 @ReadOperation 、 @WriteOperation 自定义监控端点,实现业务监控。
3. 安全管控
结合SpringSecurity,限制Actuator端点访问权限,避免生产环境泄露敏感信息。

浙公网安备 33010602011771号