构造器注入是spring boot官方推荐的依赖注入方式,它确保依赖在对象创建时确定且不可变,支持final字段,利于测试与维护;多个同类型bean时需用@qualifier指定,可借助lombok的@requiredargsconstructor简化代码。

Spring Boot 中通过构造器注入依赖对象,是官方明确推荐的方式。它让依赖关系在对象创建时就确定且不可变,天然支持 final 字段,也更利于单元测试和代码可维护性。
基本写法:直接在构造函数参数中声明依赖
Spring 会自动识别构造函数,并根据参数类型匹配容器中已注册的 Bean。如果只有一个构造函数,@Autowired 可省略:
- 定义 Service 类,声明依赖为
final字段 - 提供一个含所有依赖参数的构造函数
- Spring 启动时扫描到该类(如加了
@Service),就会调用该构造函数完成注入
示例:
```java@Service
public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
// @Autowired 可省略(Spring 4.3+ 单构造函数时)
public UserService(UserRepository userRepository, EmailService emailService) {
this.userRepository = userRepository;
this.emailService = emailService;
}
}
```
多个同类型 Bean 时:用 @Qualifier 指定具体实现
当接口有多个实现类(比如 MessageService 有 EmailMessageService 和 SmsMessageService),仅靠类型无法唯一匹配,需配合 @Qualifier 注解:
- 在构造函数参数上添加
@Qualifier("beanName") - 确保目标 Bean 的名称与注解值一致(可通过
@Component("emailMessageService")或@Service("emailMessageService")显式指定)
示例:
```java@Service
public class UserService {
private final MessageService emailService;
public UserService(@Qualifier("emailMessageService") MessageService emailService) {
this.emailService = emailService;
}
}
```
简化写法:用 Lombok 的 @RequiredArgsConstructor
手动写构造函数在依赖较多时易出错、冗长。Lombok 提供 @RequiredArgsConstructor 自动生成只包含 final 字段和 @NonNull 字段的构造函数:
- 类上加
@RequiredArgsConstructor - 需要注入的字段声明为
private final Xxx xxx; - 无需手写构造函数,也无需显式加
@Autowired
示例:
```java@Service
@RequiredArgsConstructor
public class OrderService {
private final PaymentClient paymentClient;
private final InventoryService inventoryService;
}
```
注意事项与常见问题
使用构造器注入时需留意以下几点:
- 循环依赖无法通过构造器注入解决(Spring 会抛出
BeanCurrentlyInCreationException) - 字段必须声明为
final才能保证不可变性和线程安全(非强制但强烈建议) - 若类有多个构造函数,必须明确标注
@Autowired到希望使用的那个上 - 构造器注入的 Bean 在 Spring 容器启动阶段即完成初始化,适合无条件必需的依赖











