为数组、List集合、Set集合、Map集合、Properties注入值
Employee类的代码:
public class Employee {
private String name;
private int age;
//不列出set和get方法
@Override
public String toString() {
return "Employee [name=" + name + ", age=" + age + "]";
}
}
Collection类的代码:
public class Collection {
private String[] empNames;
private List<Employee> empList;
private Set<Employee> empSet;
private Map<String,Employee> empMap;
private Properties properties;
/*
* List、Set、Map均是接口,那么它们的真实类型到底是什么呢?真实类型由IOC容器决定
*/
//不列出set和get方法
}
准备好2个Employee类的bean,代码如下:
<bean id="emp1" class="com.Employee">
<property name="name" value="張三"></property>
<property name="age" value="20"></property>
</bean>
<bean id="emp2" class="com.Employee">
<property name="name" value="李四"></property>
<property name="age" value="22"></property>
</bean>
现在为集合属性注值,代码如下:
<bean id="collection" class="com.Collection">
<!-- 为数组注入值 -->
<property name="empNames">
<list>
<value>張三</value>
<value>李四</value>
</list>
</property>
<!-- 为List集合注入值 -->
<property name="empList">
<list>
<ref bean="emp1"/>
<ref bean="emp2"/>
<ref bean="emp2"/>
</list>
</property>
<!-- 为Set集合注入值 -->
<property name="empSet">
<set>
<ref bean="emp1"/>
<ref bean="emp2"/>
<ref bean="emp2"/>
</set>
</property>
<!-- 为map注入值 -->
<property name="empMap">
<map>
<entry key="001" value-ref="emp1"></entry>
<entry key="002" value-ref="emp2"></entry>
</map>
</property>
<!-- 为 Properties注入值-->
<property name="properties">
<props>
<prop key="110">hello</prop>
<prop key="120">spring</prop>
</props>
</property>
</bean>
说明:
(1)为数组属性注入值:使用property标签下面的list子标签
为List属性注值:使用property标签下面的list子标签
为Set属性注值:使用property标签下面的set子标签
为map属性注值:使用property标签下面的map子标签
为properties属性注值:使用property标签下面的props子标签
(2)在Collection类中,有
private List<Employee> empList;
private Set<Employee> empSet;
private Map<String,Employee> empMap;
这3个属性。
①这3个属性的编译类型(声明类型)都是接口类型
②由IOC容器通过set方法为这3个属性赋值,那么IOC容器传过来的真实类型是什么呢?
public class Main {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Collection collection=(Collection)context.getBean("collection");
//输出:class java.util.ArrayList
System.out.println(collection.getEmpList().getClass());
//输出:class java.util.LinkedHashSet
System.out.println(collection.getEmpSet().getClass());
//输出:class java.util.LinkedHashMap
System.out.println(collection.getEmpMap().getClass());
}
}
可见:
IOC容器实现List接口:ArrayList;
IOC容器实现Set接口:LinkedHashSet;
IOC容器实现Map接口:LinkedHashMap。
(3)为Properties属性(有key和value,值得关注)注入值
<!-- 为 Properties注入值-->
<property name="properties">
<props>
<prop key="001">张三</prop>
<prop key="002">李四</prop>
</props>
</property>
<props>
标签里使用多个 <prop>
作为子标签。每个 <prop>
标签必须定义 key 属性
(4)为Map属性(有key和value,值得关注)注入值
<!-- 为map注入值 -->
<property name="empMap">
<map>
<entry key="001" value-ref="emp1"></entry>
<entry key="002" value-ref="emp2"></entry>
</map>
</property>
<map>
标签里使用多个 <entry>
作为子标签。每个<entry>
包含一个键和一个值
在<entry>
标签中,简单常量使用 key 和 value 属性来定义; Bean 引用通过 key-ref 和 value-ref 属性定义
(5)为数组属性注入值
<!-- 为数组注入值 -->
<property name="empNames">
<list>
<value>張三</value>
<value>李四</value>
</list>
</property>
通过property标签下面的list子标签可以为数组注入值,但后来发现使用property标签下面的array子标签也可以为数组注入值。代码如下:
public class Test {
private Object[] objs;
private int[] numbers;
private String[] strs;
//不列出set和get方法
}
<bean id="test" class="com.Test">
<property name="objs">
<array>
<value>10</value>
<null></null>
<value>hello</value>
</array>
</property>
<property name="numbers">
<array>
<value>10</value>
<value>100</value>
<value>5</value>
</array>
</property>
<property name="strs">
<array>
<value>c</value>
<value>m</value>
<value>d</value>
</array>
</property>
</bean>