Spring依赖注入选型实战指南

📅 2026/6/30 7:31:03
Spring依赖注入选型实战指南
一、首先要分清两个层面这三个概念其实不属于同一个维度构造器注入是一种注入机制怎么把对象传进来Autowired和Resource是注入注解用什么标记来告诉框架要注入所以对比时分两条线构造器注入 vs 字段注入机制层面的对比AutowiredvsResource注解层面的对比二、构造器注入 vs 字段注入包含 Autowired 和 Resource 用在字段上的情况构造器注入的特点对象创建时依赖就必须传入因此字段可以被声明为final保证不可变。由于构造器执行时依赖已经就位任何时候调用该字段都不会出现空指针异常具备天然的 NPE 安全性。Spring 启动时如果依赖 Bean 不存在会直接报错并快速失败让问题在启动阶段就暴露出来。单元测试时不需要启动 Spring 容器直接new对象并传入 Mock 依赖即可测试速度极快。缺点是无法解决循环依赖如果 A 和 B 互相依赖构造器注入会导致启动报错。字段注入的特点字段注入通过Autowired或Resource在字段上标记对象创建完成后 Spring 再通过反射把依赖塞进来。由于注入发生在对象创建之后字段不能声明为final依赖是可变的。启动时不会校验依赖是否存在只有在实际调用时才可能暴露空指针异常风险被延迟到了运行时。它能利用 Spring 的三级缓存机制打破循环依赖死锁这是字段注入最大的优势。单元测试时需要启动 Spring 容器或使用反射工具才能注入依赖测试相对麻烦。代码最为简洁在 Controller 和遗留系统改造中非常实用。三、Autowired vs ResourceAutowired是 Spring 框架原生的注解默认按类型匹配。功能非常强大支持构造器注入、字段注入、Setter 注入还支持集合注入比如注入一个 List 或 Map 时会把所有匹配的 Bean 都装进来。指定具体 Bean 名称时需要配合Qualifier一起使用。Resource是 Java 官方 JSR-250 标准定义的注解默认按名称匹配当按名称找不到时会退化为按类型匹配。它不支持构造器注入只能用于字段和 Setter 方法。指定名称直接使用自身的name属性即可不需要额外的Qualifier。不支持集合注入也不支持required false这样的可选依赖配置。选择上优先使用Autowired因为它功能更强大是 Spring 原生方案。只有在需要按名称注入且想少写一个Qualifier时才考虑Resource。四、核心区别机制层面构造器注入把依赖锁死在对象里编译时就定了安全但死板字段注入把依赖后塞进去灵活但容易出问题。注解层面Autowired按类型找是 Spring 的亲儿子功能全Resource按名字找是 Java 的亲儿子更标准但功能弱。五、选型总结配置类和核心组件用构造器注入加final安全第一启动必检。业务 Service 没有循环依赖时优先用构造器配合 Lombok。遇到循环依赖报错时果断换成Autowired字段注入破局。Controller 和老代码改造直接用Autowired字段注入灵活省事。测试类用构造器注入直接new传 Mock不启动容器。核心理念能锁死就锁死锁不死再注入。