在Spring中注入列表,集合或者映射
当我们使用value或者ref属性在Spring中注入依赖项时,可以设置单个原始值或者单个引用的bean。如果我们想在Spring中将值集合作为bean依赖项注入,那该Spring框架提供了一个选项来注入诸如List,Set,Map之类的集合。
在Spring注入集合
在Spring框架中,<list />,<set />,<map />和<props />元素分别设置Java集合类型List,Set,Map和Properties的属性和参数。
<list />:此元素用于连接Spring中的值列表。允许重复并维持订单。这个元素也可以用来连接任何类型的java.util.Collection和一个数组。
<set />:此元素与<list />相似,因为它可以连接值列表,也可以用于连接任何类型的java.util.Collection和数组。使用此元素,不允许重复且不维护顺序。
<map />:此元素用于在Spring中注入(键,值)对的集合,该元素的键和值可以是任何类型。
<props />:此元素用于在Spring中注入(键,值)对的集合,但限制为键和值均为字符串。
在Spring中注入列表和设置示例
本示例说明如何在Spring中注入列表或者集合依赖项。在以下类中,有一个类型为java.util.List的字段cityList和一个类型为java.util.Set的字段citySet。
public class WireCollection { //inject a List private List<String> cityList; //inject a Set private Set<String> citySet; public List<String> getCityList() { return cityList; } public void setCityList(List<String> cityList) { this.cityList = cityList; } public Set<String> getCitySet() { return citySet; } public void setCitySet(Set<String> citySet) { this.citySet = citySet; } }
组态
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="cityBean" class="com.theitroad.springproject.service.WireCollection"> <property name="cityList"> <list> <value>Tokyo</value> <value>Tel Aviv</value> <value>Lisbon</value> <value>Stockholm</value> <value>Stockholm</value> </list> </property> <property name="citySet"> <set> <value>Tokyo</value> <value>Tel Aviv</value> <value>Lisbon</value> <value>Stockholm</value> <value>Stockholm</value> </set> </property> </bean> </beans>
具有用于运行示例的main方法的类。
public class App { public static void main( String[] args ){ // create context using configuration ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml"); WireCollection wc = context.getBean("cityBean", WireCollection.class); System.out.println("*** Cities from city list ***"); // access the city list List<String> cityList = wc.getCityList(); for(String city : cityList) { System.out.println(city); } System.out.println("*** Cities from city set ***"); // access the city set Set<String> citySet = wc.getCitySet(); for(String city : citySet) { System.out.println(city); } // close the context context.close(); } }
输出:
*** Cities from city list *** Tokyo Tel Aviv Lisbon Stockholm Stockholm *** Cities from city set *** Tokyo Tel Aviv Lisbon Stockholm
如我们所见,集合中的重复值被拒绝。
在Spring示例中注入地图和道具
public class WireCollection { //inject a Map private Map<String,Double> cities; //inject Properties private Properties cityProp; public Map<String, Double> getCities() { return cities; } public void setCities(Map<String, Double> cities) { this.cities = cities; } public Properties getCityProp() { return cityProp; } public void setCityProp(Properties cityProp) { this.cityProp = cityProp; } }
组态
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="cityBean" class="com.theitroad.springproject.service.WireCollection"> <property name="cities"> <map> <entry key="Tokyo" value="30.5" /> <entry key="Lisbon" value="28.3" /> <entry key="Stockholm" value="23.7" /> </map> </property> <property name="cityProp"> <props> <prop key="Tokyo">30.5</prop> <prop key="Lisbon">28.3</prop> <prop key="Stockholm">23.7</prop> </props> </property> </bean> </beans>
具有用于运行示例的main方法的类。
public class App { public static void main( String[] args ){ // create context using configuration ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml"); WireCollection wc = context.getBean("cityBean", WireCollection.class); System.out.println("*** Cities from city Map ***"); Map<String,Double> cityMap = wc.getCities(); for(Map.Entry<String,Double> city : cityMap.entrySet()) { System.out.println("In " + city.getKey() + " temperature is " + city.getValue()); } System.out.println("*** Cities from city Props ***"); Properties cityProp = wc.getCityProp(); System.out.println(cityProp); // close the context context.close(); } }
输出:
*** Cities from city Map *** In Tokyo temperature is 30.5 In Lisbon temperature is 28.3 In Stockholm temperature is 23.7 *** Cities from city Props *** {Tokyo=30.5, Lisbon=28.3, Stockholm=23.7}
在列表,集合,映射中注入bean参考
我们还可以注入一个包含另一个bean引用的集合。在此示例中,有一个名为City的bean,类型为City的list,set和Map store对象。
public class City { private String cityName; private double avgTemp; public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public double getAvgTemp() { return avgTemp; } public void setAvgTemp(double avgTemp) { this.avgTemp = avgTemp; } }
public class WireCollection { private List<City> cityList; private Set<City> citySet; private Map<String,City> cities; public List<City> getCityList() { return cityList; } public void setCityList(List<City> cityList) { this.cityList = cityList; } public Set<City> getCitySet() { return citySet; } public void setCitySet(Set<City> citySet) { this.citySet = citySet; } public Map<String, City> getCities() { return cities; } public void setCities(Map<String, City> cities) { this.cities = cities; } }
组态
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="cityBean" class="com.theitroad.springproject.model.City"> <property name="cityName" value = "Mumbai" /> <property name="avgTemp" value = "32.5" /> </bean> <bean id="collectionBean" class="com.theitroad.springproject.service.WireCollection"> <property name="cityList"> <list> <ref bean="cityBean" /> <bean class="com.theitroad.springproject.model.City"> <property name="cityName" value = "Chicago" /> <property name="avgTemp" value = "15.2" /> </bean> </list> </property> <property name="citySet"> <set> <ref bean="cityBean" /> <bean class="com.theitroad.springproject.model.City"> <property name="cityName" value = "Chicago" /> <property name="avgTemp" value = "15.2" /> </bean> </set> </property> <property name="cities"> <map> <entry key="BOM" value-ref="cityBean" /> <entry key="CHI"> <bean class="com.theitroad.springproject.model.City"> <property name="cityName" value = "Chicago" /> <property name="avgTemp" value = "15.2" /> </bean> </entry> </map> </property> </bean> </beans>
在配置中,我们可以看到在所有集合List,Set或者Map Bean中都被引用,并且还作为内部Bean注入,因此有两个选项可用于在集合中设置Bean。当将bean引用为Map的键或者值时,则使用key-ref或者value-ref属性代替键或者值。
具有用于运行示例的main方法的类。
public class App { public static void main( String[] args ){ // create context using configuration ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml"); WireCollection wc = context.getBean("collectionBean", WireCollection.class); System.out.println("*** Cities from city list ***"); // access the city list List<City> cityList = wc.getCityList(); for(City city : cityList) { System.out.println("City: " + city.getCityName() + " Avg. Temp.: " + city.getAvgTemp()); } System.out.println("*** Cities from city set ***"); // access the city set Set<City> citySet = wc.getCitySet(); for(City city : citySet) { System.out.println("City: " + city.getCityName() + " Avg. Temp.: " + city.getAvgTemp()); } System.out.println("*** Cities from city Map ***"); Map<String,City> cityMap = wc.getCities(); for(Map.Entry<String,City> city : cityMap.entrySet()) { System.out.println("In " + city.getValue().getCityName() + " avg. temperature is " + city.getValue().getAvgTemp()); } // close the context context.close(); } }
输出:
*** Cities from city list *** City: Mumbai Avg. Temp.: 32.5 City: Chicago Avg. Temp.: 15.2 *** Cities from city set *** City: Mumbai Avg. Temp.: 32.5 City: Chicago Avg. Temp.: 15.2 *** Cities from city Map *** In Mumbai avg. temperature is 32.5 In Chicago avg. temperature is 15.2