为集合类型的属性注值

时间:2022-11-04 16:59:19

为数组、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>包含一个键和一个值
简单常量使用 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>