跳到正文

Spring / Spring Boot 生产检查清单 ​

适用 Spring Framework 6.x / Spring Boot 3.x。每条都可勾选,括号内是默认值或判断依据;版本差异以官方文档为准。 只列「不做会出事」的动作,机制解释见各篇正文。

上线前 ​

  • [ ] 事务方法都经过代理:@Transactional 只在 public 方法上生效,同类 this.method() 自调用不生效;用静态扫描或单测确认没有「自调用 + 事务注解」的组合,final 类/方法也不能被 CGLIB 代理。
  • [ ] 回滚规则与异常处理显式:默认只回滚 RuntimeException 和 Error,写方法统一加 @Transactional(rollbackFor = Exception.class);事务方法内 catch 后必须重新抛出,或调用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),只打日志不抛等于提交。
  • [ ] 事务边界只包数据库操作:Feign/RPC/HTTP 调用、消息发送、用户交互都移到事务外;独立日志用 REQUIRES_NEW,避免随主事务回滚。
  • [ ] 跨线程语义已确认:事务绑定在线程上,@Async 子线程不继承事务;RequestContextHolder、ThreadLocal 也不会自动传递,需要显式参数或 TaskDecorator。
  • [ ] 单例不持有可变状态:Singleton 注入 Prototype 只会在创建时取一次,需要每次新实例时用 ObjectFactory/@Lookup;单例里的成员变量必须无状态或线程安全。
  • [ ] 装配来源与扫描范围已核对:Boot 3.x 的候选配置在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,Boot 2.x 在 spring.factories;自定义 Starter 加 @ConditionalOnMissingBean;@SpringBootApplication 默认只扫启动类所在包及子包,跨包模块显式配 scanBasePackages。
  • [ ] 构造器循环依赖在启动期 fail-fast:三级缓存只解决单例 + setter 注入,构造器注入的环无法解决;不要靠开启 allowCircularReferences 掩盖,重构依赖或改 @Lazy。

运行中 ​

  • [ ] 启动与条件装配:记录启动耗时、Bean 数量、ApplicationRunner 执行时长;用 Actuator conditions 端点核对关键自动配置是否生效,而不是靠猜。
  • [ ] 事务健康度:活跃事务数、单事务持有时长、锁等待、连接池等待数;事务时长异常先查方法内是否有远程调用或大批量操作。
  • [ ] 异步线程池:队列长度、拒绝次数、活跃线程数;@Async 默认执行器不隔离业务,队列满后会直接影响接口可用性。

故障时 ​

  • [ ] 抛异常但数据没回滚 → 查方法是否 public、是否被同类自调用、异常是否为受检异常或被 catch 吞掉 → 按代理/异常两条线逐一排除,不要先怀疑数据库。
  • [ ] 启动报循环依赖或 Bean 创建失败 → 看异常里的 Bean 依赖链 → 构造器注入的环改 setter/@Lazy/拆类,不要全局放开循环引用。
  • [ ] 接口 404 或 Bean 注入不到 → 查 @RequestMapping 映射表、scanBasePackages、条件注解是否把配置排除 → 用 Actuator mappings/conditions 确认,而不是重启试。
  • [ ] 接口变慢、连接池耗尽、锁等待升高 → 查事务方法内是否调了 Feign/RPC 或等待用户输入 → 缩小事务范围,把远程调用和异步通知移出事务。
  • [ ] 单例里的 Prototype 对象始终是同一个 → 查注入方式是否为字段注入 Singleton → 改 ObjectFactory/@Lookup 或把该 Bean 改为 Prototype。

把一门技术讲透到既懂也会用