推荐构造器注入,setter注入适用于可选依赖、需后期修改或(不推荐的)循环依赖场景;需用@Autowired标注setter方法,配合@Qualifier指定多实现Bean,支持Lombok简化但不适用于final字段。

Spring Boot 中推荐使用构造器注入,但 setter 注入仍被支持,适用于可选依赖、循环依赖(不推荐)或需后期修改的场景。编写时需确保 Bean 被 Spring 管理,并通过 @Autowired 标记 setter 方法。
基础写法:在 setter 上加 @Autowired
Spring 5.2+ 默认允许无注解的单个 setter 自动装配,但显式标注更清晰、兼容性更好:
- 定义一个普通 Java 类(如
UserService),包含私有字段和 public setter 方法 - 在 setter 方法上添加
@Autowired注解 - 该类本身需是 Spring Bean(用
@Service、@Component或@Configuration+@Bean声明)
示例:
@Service
public class UserService {
private UserMapper userMapper;
@Autowired
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
配合 @Qualifier 指定具体实现
当接口有多个实现类时,仅靠类型无法确定注入哪个,需用 @Qualifier 明确:
- 在 setter 参数前加
@Qualifier("beanName"),beanName 是目标 Bean 的名称(默认为类名首字母小写) - 也可配合
@Primary在候选 Bean 中指定首选项
示例:
@Autowired
public void setPaymentService(@Qualifier("alipayService") PaymentService paymentService) {
this.paymentService = paymentService;
}
与 Lombok 结合简化代码
使用 Lombok 的 @Setter 和 @RequiredArgsConstructor 可减少样板代码,但注意:
-
@Setter(onMethod_ = @Autowired)可为生成的 setter 自动添加@Autowired - 若字段为 final,Lombok 会跳过生成 setter;此时建议改用构造器注入
示例:
@Service
@Setter(onMethod_ = @Autowired)
public class OrderService {
private OrderRepository orderRepository;
private NotificationService notificationService;
}
注意事项与常见问题
setter 注入不是万能方案,需留意以下几点:
- 对象可能处于“半初始化”状态:构造完成但 setter 尚未调用,字段为 null —— 应避免在构造器中使用未注入的依赖
- 不适用于
final字段(setter 无法赋值),也不利于不可变设计 - 单元测试时需手动调用 setter,不如构造器注入直观
- Spring Boot 2.6+ 默认禁用循环依赖,若强行启用(
spring.main.allow-circular-references=true),setter 是唯一可行方式(但应重构代码消除循环)











