14

  1. 启动原理:SpringApplication run 流程

1. 判定是否为 Web 应用(Reactive / Servlet)
2. 加载并初始化  SpringFactoriesLoader ,加载所有  META-INF/spring.factories 
3. 创建并初始化  ApplicationContext 
4. 执行  ApplicationContextInitializer  初始化
5. 加载所有自动配置类  AutoConfiguration 
6. 执行  BeanDefinition  注册、依赖注入
7. 执行  ApplicationRunner 、 CommandLineRunner 
8. 启动内置 Web 容器(Tomcat/Jetty/Undertow)

重点难点:

  • SPI 机制与 SpringFactoriesLoader
  • @Conditional 条件装配原理
  • BeanFactoryPostProcessor、BeanPostProcessor 执行时机与区别

  1. 自动配置原理(面试必考)

核心:

  • @EnableAutoConfiguration
  • @Import(AutoConfigurationImportSelector.class)

流程:

1. 从  spring-boot-autoconfigure  下读取所有自动配置类
2. 通过  @Conditional  系列注解判断是否生效
3. 绑定  xxxProperties  读取配置文件
4. 向容器注册自动配置好的 Bean

难点:

  • 如何手写一个 Starter
  • 如何禁用某个自动配置
  • @ConditionalOnBean / OnClass / OnMissingBean / OnProperty  执行顺序与坑

  1. 内嵌 Tomcat 启动与替换原理

1. SpringBoot 通过  ServletWebServerFactory  创建容器
2. 自动配置  TomcatServletWebServerFactory 
3. 启动时创建 Tomcat 实例并绑定端口

难点:

  • 如何替换成 Undertow/Jetty
  • Tomcat 线程池、连接器、最大连接数调优
  • 容器启动失败、端口冲突、优雅停机原理

  1. Bean 生命周期(深度)

精简硬核版:

1. 实例化(反射)
2. 填充属性 @Autowired、@Value
3. 执行  BeanNameAware 、 BeanFactoryAware 
4. 执行  BeanPostProcessor#postProcessBeforeInitialization 
5. 执行  @PostConstruct  /  InitializingBean#afterPropertiesSet  / init-method
6. 执行  BeanPostProcessor#postProcessAfterInitialization (AOP 代理在这里生成)
7. 容器关闭: @PreDestroy 、 DisposableBean

难点:

  • AOP 代理为什么不能作用于自身调用方法?
  • this  调用与代理对象区别
  • 循环依赖解决原理(三级缓存)

  1. 循环依赖与三级缓存(极高频难点)

Spring 解决单例+Setter 注入的循环依赖:

  • 一级缓存:成品 Bean
  • 二级缓存:早期半成品 Bean(未完成初始化)
  • 三级缓存: ObjectFactory  延迟创建代理

关键点:

  • 构造器注入无法解决循环依赖
  • 多例 Bean 不解决循环依赖
  • AOP + 循环依赖时,代理创建时机

  1. SpringBoot 事务原理

核心:

  • @EnableTransactionManagement
  • TransactionInterceptor  拦截
  • AOP 环绕通知

流程:

1. 开启事务
2. 业务执行
3. 异常回滚 / 正常提交
4. 释放连接

难点坑点:

  • private 方法、final 方法事务不生效
  • this.方法() 不生效
  • 非 RuntimeException 默认不回滚
  • 事务传播机制 REQUIRED、REQUIRES_NEW、NESTED 区别与场景

  1. SpringBoot 整合 MyBatis 原理
  • @MapperScan  扫描 Mapper 接口
  • MapperFactoryBean  生产 Mapper 代理对象
  • SqlSessionTemplate  线程安全的 SqlSession

难点:

  • 为什么 Mapper 是接口却能被注入?
  • 一级缓存、二级缓存机制与坑
  • 分页插件 PageHelper 原理

  1. SpringBoot 配置加载优先级(高级)

加载顺序(从低 → 高):

1. 配置文件
2. 系统环境变量
3. 命令行参数
4.  @TestPropertySource 
5. JVM 参数

难点:

  • 不同环境(dev/test/prod)配置覆盖规则
  • 配置加解密原理(jasypt)

  1. 优雅停机(Graceful Shutdown)

关键点:

  • 配置: server.shutdown=graceful
  • 容器收到停机信号 → 不再接收新请求 → 等待已有请求处理完 → 关闭

难点:

  • 如何保证任务不丢失
  • 结合 @PreDestroy、@Async 线程池关闭

  1. SpringBoot 监控与扩展
  • Actuator 端点原理
  • SpringBoot 自定义 Starter 完整流程
  • ImportBeanDefinitionRegistrar  手动注册 Bean
  • FactoryBean  与 BeanFactory 区别

  1. 线程池与 @Async 高级

难点:

  • 如何自定义线程池并替换默认
  • 线程池参数:核心线程、最大线程、队列、拒绝策略
  • 异步方法事务不生效问题
  • 线程上下文丢失(如 RequestContext)

  1. SpringBoot 常见性能调优(偏难)
  • JVM 参数调优(堆、元空间、GC)
  • Tomcat 线程池调优
  • 连接池(HikariCP)最优配置
  • 关闭不必要的自动配置
  • 懒加载  spring.main.lazy-initialization=true  利
posted @ 2026-02-24 22:08  111阳  阅读(33)  评论(0)    收藏  举报