1. Spring依赖注入概述
在Spring框架中,依赖注入(Dependency Injection)是实现控制反转(IoC)的核心机制。构造注入(Constructor Injection)作为Spring三种主要依赖注入方式之一,通过调用类的构造方法来完成依赖关系的建立。与setter注入相比,构造注入具有以下特点:
- 强制依赖:构造注入适合表达类运行所必需的依赖关系,这些依赖在对象创建时就必须提供
- 不变性:通过构造注入的依赖通常被声明为final字段,确保对象一旦创建其依赖关系就不会改变
- 线程安全:由于依赖项在构造阶段就完全初始化完毕,避免了多线程环境下的竞态条件
提示:Spring官方文档推荐对强制依赖使用构造注入,对可选依赖使用setter注入
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 构造注入基础实现
2.1 基本开发步骤
实现构造注入需要两个基本步骤:
- 定义包含参数的构造方法
java复制public class OrderService {
private final PaymentGateway paymentGateway;
private final InventoryService inventoryService;
public OrderService(PaymentGateway paymentGateway, InventoryService inventoryService) {
this.paymentGateway = paymentGateway;
this.inventoryService = inventoryService;
}
// 业务方法...
}
- 在Spring配置中声明bean依赖
xml复制<bean id="orderService" class="com.example.OrderService">
<constructor-arg ref="paymentGateway"/>
<constructor-arg ref="inventoryService"/>
</bean>
<bean id="paymentGateway" class="com.example.PaymentGatewayImpl"/>
<bean id="inventoryService" class="com.example.InventoryServiceImpl"/>
2.2 构造参数匹配规则
Spring通过以下方式匹配构造参数:
- 参数顺序匹配:默认情况下,
<constructor-arg>元素的顺序必须与构造方法参数的顺序一致 - 参数类型匹配:当存在多个同类型的参数时,Spring会尝试按声明顺序匹配
- 显式索引指定:可以通过
index属性明确指定参数位置(从0开始)
xml复制<bean id="exampleBean" class="com.example.ExampleBean">
<constructor-arg index="0" value="firstArg"/>
<constructor-arg index="1" value="secondArg"/>
</bean>
3. 构造方法重载处理
3.1 参数个数不同的重载
当类中存在多个构造方法时,Spring会根据提供的参数数量选择最匹配的构造方法:
java复制public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
// 构造方法1:两个参数
public UserService(UserRepository userRepository, EmailService emailService) {
this.userRepository = userRepository;
this.emailService = emailService;
}
