Spring 框架的核心特性之一是依賴注入,提供多樣化的屬性注入方式以適應不同場景。本文系統整理建構子注入、Setter 注入、p 命名空間注入三種基本形式,並深入探討物件、陣列、List、Map、Properties 等複雜類型的注入配置,附完整程式碼範例供參考。
透過類別的建構子傳入依賴,確保物件建立時即擁有完整狀態,適合強制依賴與不可變物件場景。
// 目標類別
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、支援不可變欄位、利於單元測試。
缺點:參數過多時可讀性下降、循環依賴較難處理。
最常用、最靈活的方式,透過 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 注入屬性。
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"/>
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>。
@Autowired、@Value、@Qualifier)或Java Config(@Bean、@Configuration),減少 XML 維護成本。util: 命名空間(<util:list>、<util:map> 等)將集合定義為獨立 Bean,提升複用性。完整範例程式碼可參考:GitHub 專案