spring心得4--setter注入集合(set、list、map、properties等多种集合,配有案例解析)@基本装
在spring容器内拼凑bean叫做装配。装配bean的时候,需要告诉容器哪些bean以及容器如何使用依赖注入将它们配合在一起。
使用XML装配(xml是最常见的spring应用系统配置源。)
几种spring容器都支持使用xml装配bean,包括:
1).XmlBeanFactory:调用InputStream载入上下文定义文件。
2).ClassPathXmlApplicationContext:从类路径载入上下文定义文件。
3).XmlWenApplicationContext:从web应用上下文中载入定义文件。
上下文定义文件的根元素是<beans>.<beans>有多个<bean>子元素。每个<bean>元素定义了一个bean如何被装配到spring容器中。对bean的最基本的配置包括bean的ID和他的全称类名。
基本装配-scope
scope属性的值有以下五种:prototype、singleton、request session、global-session。
spring中的bean缺省情况下是单例模式。始终返回一个实例。若想返回不同的实例的话需要定义成原型模式。
2. 实例化与销毁
spring实例化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法(bean的声明周期在上篇博客有重墨讲解)。
<bean class="Foo" init-method destory-method>
<bean class="...CommonAnnotationBeanPostProcessor">
spring也提供了两个接口来实现相同的功能:
InitializingBean和DisposableBean.InitializingBean接口提供了一个afterPropertiesSet()方法。DisposableBean接口提供了destroy().不推荐使用该接口,它将你的bean和springAPI邦定在一起。
3.一些注意事项
继承配置(继承在bean标签加属性parent属性加以指明,该属性值为继承父类bean的id),覆盖父 Bean配置。
可以设置 <bean> 的abstract 属性为 true, Spring 不会实例化该Bean有些属性不会被继承. 比如: autowire, abstract 等.子Bean 指定自己的class. 但此时 abstract 必须设为 true
通过set方法依赖注入
<bean>元素的< property >子元素指明了使用它们的set方法来注入。可以注入任何东西,从基本类型到集合类,甚至是应用系统的bean
配置bean的简单属性,基本数据类型和string。
在对应bean实例的property子标签中设置一个bean类型的属性;这种方式的缺点是你无法在其它地方重用这个bar实例,原因是它是专门为foo而用。
4.setter注入集合
装配List和数组:
<property name="barlist">
<list>
<value>bar1</value>
<ref bean="bar2"/>
</list>
</property>
装配set:
<property name="barlist">
<set>
<value>bar1</value>
<ref bean="bar2"/>
</set>
</property>
set使用方法和list一样,不同的是对象被装配到set中,而list是装配到List或数组中装配
装配map:
<property name="barlist">
<map>
<entry key="key1" value="bar1" />
<entry key="key2 value-ref="xxx" />
</map>
</property>
key值必须是string的,key-ref可以是其他bean。
设置null:
<property name="barlist">
<null/>
</property>
注入集合的案例分析
以下类中的属性命名方式和访问权限修饰符都是为了做测试,比如下面属性都是public类型的。实际开发中都是private类型,通过get方法来访问属性,这里只是为了简单测试 。
集合bean CollectionBean类
package www.csdn.spring.collection.set; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; publicclass CollectionBean { //set集合 public Set<String> sets; publicvoid setSets(Set<String> sets) { this.sets = sets; } public CollectionBean() { System.out.println("初始化。。。。。"); } //list集合 public List<User> users; publicvoid setUsers(List<User> users) { this.users = users; } //map集合 public Map<Integer,User> map; publicvoid setMap(Map<Integer, User> map) { this.map = map; } //properties集合 public Properties props; publicvoid setProps(Properties props) { this.props = props; } } 辅助类 user package www.csdn.spring.collection.set; publicclass User { public String name; public Integer age; publicvoid setName(String name) { this.name = name; } publicvoid setAge(Integer age) { this.age = age; } } 测试类 TestBean package www.csdn.spring.collection.set; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; publicclass TestBean { @Test publicvoid test() { ApplicationContext context = new ClassPathXmlApplicationContext("spring-collection.xml"); CollectionBean bean = context.getBean("collectionBean",CollectionBean.class); //set集合 Set<String> sets = bean.sets; //得到迭代器 Iterator<String> it = sets.iterator(); while(it.hasNext()){ System.out.println(it.next()); } System.out.println("-------------------------list集合------------------------"); //list集合 List<User> users = bean.users; for(User user : users){ System.out.println(user.name+"---"+user.age); } System.out.println("--------------------------map集合------------------------"); //map集合 //方法一: Map<Integer,User> map = bean.map; //得到map的key键的set集合 Set<Integer> setKeys = map.keySet(); //得到key键的迭代器 Iterator<Integer> itKeys = setKeys.iterator(); //迭代键值 while(itKeys.hasNext()){ //得到一个具体键值 Integer key = itKeys.next(); //通过get(key)方法获取到key值对应的value User user = map.get(key); System.out.println(key+"--"+user.name+"="+user.age); } System.out.println("========================"); //方法二: Set<Entry<Integer,User>> setEntry = map.entrySet(); Iterator<Entry<Integer,User>> itEntry = setEntry.iterator(); while(itEntry.hasNext()){ Entry<Integer,User> entry = itEntry.next(); User user = entry.getValue(); System.out.println(entry.getKey()+"---"+user.name+"="+user.age); } System.out.println("-------------------------properties集合------------------------"); //properties集合 Properties props = bean.props; Set<String> setProps = props.stringPropertyNames(); Iterator<String> keyStr = setProps.iterator(); while(keyStr.hasNext()){ String key = keyStr.next(); //通过getProperty(key)方法来获取key对应的value值 System.out.println(key+"----"+props.getProperty(key)); } } } spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="collectionBean" class="www.csdn.spring.collection.set.CollectionBean"> <!-- set集合 --> <property name="sets"> <set> <value>陈红军</value> <value>杨凯</value> <value>李伟</value> <value>小胖</value> <value>潇洒</value> </set> </property> <!-- list集合 --> <property name="users"> <array> <ref bean="u1" /> <ref bean="u2" /> <ref bean="u3" /> </array> <!-- <list> <ref bean="u1"/> <ref bean="u2"/> <ref bean="u3"/> </list> --> </property> <!-- map集合 --> <property name="map"> <map> <entry key="1" value-ref="u1" /> <entry key="2"> <ref bean="u2" /> </entry> <entry key="3" value-ref="u3" /> </map> </property> <!--properties集合 --> <property name="props"> <props> <prop key="1">jdbc:oracle</prop> <prop key="2">jdbc:mysql</prop> <prop key="3">jdbc:access</prop> </props> </property> </bean> <bean id="u1" class="www.csdn.spring.collection.set.User"> <property name="name" value="杨凯" /> <property name="age" value="22" /> </bean> <bean id="u2" class="www.csdn.spring.collection.set.User"> <property name="name" value="潇洒" /> <property name="age" value="22" /> </bean> <bean id="u3" class="www.csdn.spring.collection.set.User"> <property name="name" value="红军" /> <property name="age" value="28" /> </bean> </beans>