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

Spring 屬性注入全攻略:三種基本方式與複雜類型注入詳解

     編輯:Java 相關知識

前言

Spring 框架的核心特性之一是依賴注入,提供多樣化的屬性注入方式以適應不同場景。本文系統整理建構子注入、Setter 注入、p 命名空間注入三種基本形式,並深入探討物件、陣列、List、Map、Properties 等複雜類型的注入配置,附完整程式碼範例供參考。

三種基本屬性注入方式

1. 建構子注入

透過類別的建構子傳入依賴,確保物件建立時即擁有完整狀態,適合強制依賴與不可變物件場景。

// 目標類別
public class User4 {
    private final String username;
    public User4(String username) { this.username = username; }
    // getter、toString 省略
}
<!-- XML 配置 -->
<bean id="user4" class="org.sang.User4">
    <constructor-arg name="username" value="張三"/>
</bean>

優點:依賴不可為 null、支援不可變欄位、利於單元測試。
缺點:參數過多時可讀性下降、循環依賴較難處理。

2. Setter 注入

最常用、最靈活的方式,透過 setter 方法注入依賴,適合可選依賴與可變物件。

public class User5 {
    private String username;
    public void setUsername(String username) { this.username = username; }
    // getter、toString 省略
}
<bean id="user5" class="org.sang.User5">
    <property name="username" value="lisi"/>
</bean>

Spring 容器先呼叫無參建構子建立實例,再呼叫 setter 注入屬性。

3. p 命名空間注入

XML 縮寫語法,減少 <property> 標籤嵌套,本質仍是 Setter 注入。

<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:p="https://www.springframework.org/schema/p"
       xsi:schemaLocation=".../spring-beans.xsd">

    <bean id="user6" class="org.sang.User6" p:username="張三"/>
</beans>

注意:需在 <beans> 根元素宣告 xmlns:p 命名空間。

複雜類型屬性注入詳解

物件注入(協作物件)

Service 注入 DAO 是典型場景,使用 ref 屬性引用另一個 Bean。

<bean id="userDao" class="org.sang.UserDao"/>
<bean id="userService" class="org.sang.UserService">
    <property name="userDao" ref="userDao"/>
</bean>

也可改用建構子注入:<constructor-arg name="userDao" ref="userDao"/>

集合與 Map 注入

Spring 提供專屬 XML 標籤對應 Java 集合介面:

Java 類型XML 標籤子元素
List / 陣列<list><value>, <ref>, <bean>
Set<set>同 List
Map<map><entry key="" value=""/> 或 <entry key=""><value>...</value></entry>
Properties<props><prop key="">value</prop>
public class User7 {
    private String[] names;
    private List<String> list;
    private Map<String, String> map;
    private Properties properties;
    // 對應 setter 省略
}
<bean id="user7" class="org.sang.User7">
    <property name="names">
        <list><value>張三</value><value>李四</value><value>王五</value></list>
    </property>
    <property name="list">
        <list><value>足球</value><value>籃球</value><value>乒乓球</value></list>
    </property>
    <property name="map">
        <map>
            <entry key="username" value="張三"/>
            <entry key="password" value="123456"/>
        </map>
    </property>
    <property name="properties">
        <props><prop key="username">趙六</prop></props>
    </property>
</bean>

關鍵點:陣列與 List 共用 <list> 標籤,Spring 自動依目標類型轉換;Map 需指定 key-value;Properties 專用 <props>/<prop>。

總結與建議

  • 強制依賴優先用建構子注入;可選依賴用 Setter 注入。
  • 現代 Spring 專案建議改用註解驅動(@Autowired、@Value、@Qualifier)或Java Config(@Bean、@Configuration),減少 XML 維護成本。
  • 複雜集合注入時,善用 util: 命名空間(<util:list>、<util:map> 等)將集合定義為獨立 Bean,提升複用性。

完整範例程式碼可參考:GitHub 專案

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