主题
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执行时长;用 Actuatorconditions端点核对关键自动配置是否生效,而不是靠猜。 - [ ] 事务健康度:活跃事务数、单事务持有时长、锁等待、连接池等待数;事务时长异常先查方法内是否有远程调用或大批量操作。
- [ ] 异步线程池:队列长度、拒绝次数、活跃线程数;
@Async默认执行器不隔离业务,队列满后会直接影响接口可用性。
故障时
- [ ] 抛异常但数据没回滚 → 查方法是否 public、是否被同类自调用、异常是否为受检异常或被 catch 吞掉 → 按代理/异常两条线逐一排除,不要先怀疑数据库。
- [ ] 启动报循环依赖或 Bean 创建失败 → 看异常里的 Bean 依赖链 → 构造器注入的环改 setter/
@Lazy/拆类,不要全局放开循环引用。 - [ ] 接口 404 或 Bean 注入不到 → 查
@RequestMapping映射表、scanBasePackages、条件注解是否把配置排除 → 用 Actuatormappings/conditions确认,而不是重启试。 - [ ] 接口变慢、连接池耗尽、锁等待升高 → 查事务方法内是否调了 Feign/RPC 或等待用户输入 → 缩小事务范围,把远程调用和异步通知移出事务。
- [ ] 单例里的 Prototype 对象始终是同一个 → 查注入方式是否为字段注入 Singleton → 改
ObjectFactory/@Lookup或把该 Bean 改为 Prototype。