在 Spring 框架中,除了使用 value 屬性注入單一值、用 ref 屬性注入 Bean 參考外,還經常需要將多個值注入到集合類型的屬性中。Spring 提供了四種集合配置元素來支援 Java Collection 類型:<list>、<set>、<map> 和 <props>,分別對應 List、Set、Map 和 Properties。
package com.example.spring.collection;
import java.util.*;
public class JavaCollection {
private List<String> addressList;
private Set<String> addressSet;
private Map<String, String> addressMap;
private Properties addressProp;
// Setter 方法
public void setAddressList(List<String> addressList) { this.addressList = addressList; }
public void setAddressSet(Set<String> addressSet) { this.addressSet = addressSet; }
public void setAddressMap(Map<String, String> addressMap) { this.addressMap = addressMap; }
public void setAddressProp(Properties addressProp) { this.addressProp = addressProp; }
// Getter 並列印內容
public List<String> getAddressList() {
System.out.println("List Elements: " + addressList);
return addressList;
}
public Set<String> getAddressSet() {
System.out.println("Set Elements: " + addressSet);
return addressSet;
}
public Map<String, String> getAddressMap() {
System.out.println("Map Elements: " + addressMap);
return addressMap;
}
public Properties getAddressProp() {
System.out.println("Properties Elements: " + addressProp);
return addressProp;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="javaCollection" class="com.example.spring.collection.JavaCollection">
<!-- List 注入:允許重複值 -->
<property name="addressList">
<list>
<value>Taiwan</value>
<value>Japan</value>
<value>USA</value>
<value>USA</value>
</list>
</property>
<!-- Set 注入:自動去重 -->
<property name="addressSet">
<set>
<value>Taiwan</value>
<value>Japan</value>
<value>USA</value>
<value>USA</value>
</set>
</property>
<!-- Map 注入:鍵值對 -->
<property name="addressMap">
<map>
<entry key="1" value="Taiwan"/>
<entry key="2" value="Japan"/>
<entry key="3" value="USA"/>
<entry key="4" value="USA"/>
</map>
</property>
<!-- Properties 注入:鍵值對皆為字串 -->
<property name="addressProp">
<props>
<prop key="one">Taiwan</prop>
<prop key="two">Japan</prop>
<prop key="three">USA</prop>
<prop key="four">USA</prop>
</props>
</property>
</bean>
</beans>
List Elements: [Taiwan, Japan, USA, USA]
Set Elements: [Taiwan, Japan, USA]
Map Elements: {1=Taiwan, 2=Japan, 3=USA, 4=USA}
Properties Elements: {two=Japan, one=Taiwan, three=USA, four=USA}
注意:List 保留重複值與順序,Set 自動去重,Map 與 Properties 僅存儲鍵值對,Properties 的鍵值皆為字串類型。
集合元素不僅可以是字面值,也可以是其他 Bean 的參考,甚至混合使用:
<bean id="address1" class="com.example.Address">
<property name="city" value="Taipei"/>
</bean>
<bean id="address2" class="com.example.Address">
<property name="city" value="Tokyo"/>
</bean>
<bean id="javaCollection" class="com.example.spring.collection.JavaCollection">
<property name="addressList">
<list>
<ref bean="address1"/>
<ref bean="address2"/>
<value>Japan</value>
</list>
</property>
<property name="addressSet">
<set>
<ref bean="address1"/>
<ref bean="address2"/>
<value>Japan</value>
</set>
</property>
<property name="addressMap">
<map>
<entry key="one" value="Taiwan"/>
<entry key="two" value-ref="address1"/>
<entry key="three" value-ref="address2"/>
</map>
</property>
</bean>
<bean id="exampleBean" class="com.example.ExampleBean">
<property name="email" value=""/>
</bean>
等同於 Java 代碼:exampleBean.setEmail("")
<bean id="exampleBean" class="com.example.ExampleBean">
<property name="email"><null/></property>
</bean>
等同於 Java 代碼:exampleBean.setEmail(null)
java.util.List 或陣列java.util.Setjava.util.Mapjava.util.Properties善用集合注入可大幅簡化配置,讓 Bean 之間的關係更清晰易維護。