| 維度 | Setter 注入 | 構造器注入 |
| 假設 | 所有屬性可變、可選 | 可強制不可變依賴 |
| 不可變性 | 難以保證 | 天然支持 final/不可變對象 |
| 依賴完整性 | 運行時發現缺失 | 實例化時強制檢查 |
| 循環依賴 | 支持 | 不支持(需配合 Setter) |
結論:強制依賴用構造器,可選依賴用 Setter,現代 Spring 推薦構造器注入為主。
實體類
public class EmployeeBean {
private String name;
private Double salary;
private Dept dept;
private String sex;
public EmployeeBean(String name, Double salary, Dept dept, String sex) {
this.name = name; this.salary = salary; this.dept = dept; this.sex = sex;
}
// getter/toString
}
public class Dept {
private String name, deptno;
// setter/getter/toString
}
四種構造器注入配置方式
1. 順序匹配(原始,不推薦)
<bean id="employeeBean" class="...EmployeeBean">
<constructor-arg value="王曉而"/>
<constructor-arg value="100.0"/>
<constructor-arg ref="dept"/>
<constructor-arg value="男"/>
</bean>
缺點:參數順序變更導致注入錯誤,可讀性差。
2. 按類型匹配
<bean id="employeeBean" class="...EmployeeBean">
<constructor-arg type="java.lang.String" value="陳紅均"/>
<constructor-arg type="java.lang.String" value="男"/>
<constructor-arg type="java.lang.Double" value="100.0"/>
<constructor-arg type="www.csdn.spring.constructor.bean.Dept" ref="dept"/>
</bean>
⚠️ 若有多個同類型參數(如兩個 String),類型匹配會失敗/錯誤注入。
3. 按索引匹配
<bean id="employeeBean" class="...EmployeeBean">
<constructor-arg index="0" value="陳紅均"/>
<constructor-arg index="1" value="100.0"/>
<constructor-arg index="2" ref="dept"/>
<constructor-arg index="3" value="女"/>
</bean>
明確指定參數位置,解決同類型歧義,但耦合構造器簽名順序。
4. 按參數名匹配(推薦,需編譯保留參數名)
<bean id="employeeBean" class="...EmployeeBean">
<constructor-arg name="name" value="陳紅均"/>
<constructor-arg name="salary" value="100.0"/>
<constructor-arg name="dept" ref="dept"/>
<constructor-arg name="sex" value="男"/>
</bean>
最語義化、抗重構,需編譯時加 -parameters (Java 8+) 或啟用調試信息。
Dept Bean 配置
<bean id="dept" class="...Dept">
<property name="name" value="CSDN教育事業部"/>
<property name="deptno" value="0x0001"/>
</bean>
現代 Spring 最佳實踐
@Component
public class EmployeeBean {
private final String name;
private final Double salary;
private final Dept dept;
private final String sex;
@Autowired // 單構造器可省略
public EmployeeBean(String name, Double salary, Dept dept, String sex) { ... }
}
- 構造器參數自動按類型注入,配合
@Qualifier 解歧義
- 字段
final 保證不可變性
- 零 XML,編譯期類型安全
總結選型
| 方式 | 適用場景 | 維護性 |
| 順序 | 極簡測試 | 差 |
| 類型 | 無同類型參數 | 中 |
| 索引 | 有同類型參數、不想依賴參數名 | 中 |
| 參數名 | 標準開發、現代 Java | 優 |
| 註解駆動 | Spring 3.1+ 現代項目 | 最優 |
掌握四種 XML 配置方式,理解演進邏輯,現代開發請擁抱註解駆動構造器注入。
- 上一篇文章: Spring 入門(八):Bean 自動裝配四大模式深度解析與避坑指南
- 下一篇文章: Spring 入門(六):Setter 注入 null 值配置技巧
Copyright ©
程式碼之家 All Rights Reserved