Bean的基本装配
内部Bean
内部bean(inner bean)是指在一个bean的<property/>
或 <constructor-arg/>
元素中使用<bean/>
元素定义的bean。内部bean定义不需要有id或name属性,即使指定id 或 name属性值也将会被容器忽略。
内部bean总是匿名的且他们总是prototype模式的。同时将内部bean注入到包含该内部bean之外的bean是不可能的。
案例: AddressServiceImpl.java public class AddressServiceImpl { private String name; private void setName(String name) { this.name = name; } } EmpServiceImpl.java public class EmpServiceImpl { private AddressServiceImpl addressServiceImpl; /** * 1、接口注入 * 2、set方法注入 * 3、构造器注入 * spring支持 2、3*/ public void setAddressServiceImpl(AddressServiceImpl addressServiceImpl) { this.addressServiceImpl = addressServiceImpl; } } applicationContext.xml <?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-2.5.xsd"> <!-- 采用内部bean的方式写 --> <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> <property name="addressServiceImpl"> <!-- 内部bean定义不需要有id或name属性,即使指定id 或 name属性值也将会被容器忽略。--> <bean id="addressServiceImpl" class="cn.csdn.service.AddressServiceImpl"/> <!-- 注意:内部bean中的scope标记及id或name属性将被忽略。 内部bean总是匿名的且它们总是prototype模式的。 同时将内部bean注入到包含该内部bean之外的bean是不可能的。--> </property> </bean> <!-- 对于bean的引用来说我们就采用ref bean属性即可 --> </beans> 补充:除了使用内部Bean的引用方式之外还可以采用ref属性引入的方式写 具体代码如下: <bean id="empS0065rviceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> <property name="addressServiceImpl"> <ref bean="addressServiceImpl"/> </property> </bean> <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> <property name="addressServiceImpl" ref="addressServiceImpl"/> </bean>
装配集合
通过<list/>
、<set/>
、<map/>
及<props/>
元素可以定义和设置与Java Collection
类型对应List
、Set
、Map
及Properties
的值。
List集合 案例分析: AddressServiceImpl.java public class AddressServiceImpl { private String name; private void setName(String name) { this.name = name; } } EmpServiceImpl.java public class EmpServiceImpl { private AddressServiceImpl addressServiceImpl; private List<String> list; public AddressServiceImpl getAddressServiceImpl() { return addressServiceImpl; } public void setAddressServiceImpl(AddressServiceImpl addressServiceImpl) { this.addressServiceImpl = addressServiceImpl; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } } List.xml <?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-2.5.xsd"> <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> <property name="list"> <list> <value>dxl</value> <value>dxl-dong</value> <value>xl</value> <value>dxl_dong</value> </list> </property> </bean> </beans>
Map集合 Map中的每条条目是由一个主键和一个数值组成的用<entry>元素来定义一条条目。Map中<entry>的数值和<list>及<set>的一样,可以使任何有效的属性元素,包括<value><ref><list><map>等,注意:配置<entry>时,属性key的值只能是String。 案例: 在EmpServiceImpl.java类中添加private Map<String,Integer> map的属性并生成相应的set()、get()方法 Map.xml中的配置如下 <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> <property name="map"> <map> <entry key="dxl"> <value>1</value> </entry> <entry key="dxl-dong"> <value>2</value> </entry> <entry key="xl"> <value>3</value> </entry> <entry key="xiaoli"> <value>4</value> </entry> </map> </property> </bean> 注:<value>属性中的值可以使用<ref>来引用;<ref>与<value>是并列的,ref并不是在value中定义
Set集合 案例说明: 在EmpServiceImpl.java类中添加private Set<AddressServiceImpl > set和 private AddressServiceImpl addressServiceImpl的属性并生成相应的set()、get()方法 set.xml中的配置如下 <bean id="addressServiceImpl" class="cn.csdn.service.AddressServiceImpl" scope="singleton"> <property name="name"> <value>北京</value> </property> </bean> <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> <property name="set"> <set> <ref bean="addressServiceImpl"/> </set> </property> </bean> 补充:测试list是否允许重复 案例: 在EmpServiceImpl.java类中添加 private List<AddressServiceImpl> list1 和 private AddressServiceImpl addressServiceImpl的属性并生成相应的set()、get()方法 List.xml中的配置如下: <bean id="addressServiceImpl" class="cn.csdn.service.AddressServiceImpl" scope="singleton"> <property name="name"> <value>北京</value> </property> </bean> <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> <property name="list1"> <list> <ref bean="addressServiceImpl"/> <ref bean="addressServiceImpl"/> <ref bean="addressServiceImpl"/> <ref bean="addressServiceImpl"/> <ref bean="addressServiceImpl"/> <ref bean="addressServiceImpl"/> <ref bean="addressServiceImpl"/> </list> </property> </bean> 比较得知结果:list集合是允许重复的,而set集合是不允许重复的
装配Properties Java.util.Properties集合是最后一个能在Spring中装配的集合类,使用<props>元素装配,使用<prop>元素表示每条熟悉,但<prop>的值只能是String类型。 在EmpServiceImpl.java类中添加 private Properties prop和 private AddressServiceImpl addressServiceImpl的属性并生成相应的set()、get()方法 Props.xml中的配置如下 <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> <property name="prop"> <props> <prop key="driverclass"> com.msysql.jdbc.Driver </prop> <prop key="user"> dxl_dong </prop> <!-- prop中必须是字符串 --> <prop key="password"> dxl </prop> </props> </property> </bean> 运行结果中:运行顺序是user、password、driverClass也就是说没有保证顺序、
设置null <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> //第一中设置null值的方式 <property name="addressServiceImpl"> <null/> </property> <!—第二中国设置null值的方式 <property name="addressServiceImpl"> <value>null</value> </property> --> </bean>