首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 入門(七):構造器注入四種方式詳解與最佳實踐

     編輯:Java 相關知識

構造器注入 vs 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,編譯期類型安全

總結選型

維度Setter 注入構造器注入
假設所有屬性可變、可選可強制不可變依賴
不可變性難以保證天然支持 final/不可變對象
依賴完整性運行時發現缺失實例化時強制檢查
循環依賴支持不支持(需配合 Setter)
方式適用場景維護性
順序極簡測試差
類型無同類型參數中
索引有同類型參數、不想依賴參數名中
參數名標準開發、現代 Java優
註解駆動Spring 3.1+ 現代項目最優

掌握四種 XML 配置方式,理解演進邏輯,現代開發請擁抱註解駆動構造器注入。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved