# 注入集合对象

### 定义一个 Computer 类和 Company 类

其关系是 Company 持有 Computer 对象的集合

```java
public class Computer {
    private String brand;
    private String type;
    private String sn;
    private int price;

    public Computer() {
    }

    public Computer(String brand, String type, String sn, int price) {
        this.brand = brand;
        this.type = type;
        this.sn = sn;
        this.price = price;
    }
    
    // getter, setter, toSting 方法省略        
}
```

Company 还有一个 Properties  类型的数据 info。 Properties 类型和Map 类型相似，不过它的 key 和 value 都为 String 。

```java
public class Company {
    private Set<String> rooms;// 若定义成有序且可以重复则使用List
    private Map<String,Computer> computers;
    private Properties info;
    
    // getter, setter, toSting 方法省略   
}
```

### applicationContext.xml 中实现依赖注入

computer 对象使用构造方法进行依赖注入。 company 对象中的 rooms 使用 < set >  标签实现依赖注入,  computers 使用 \<map> 标签依赖注入，info 使用 \<props> 标签进行依赖注入。

```xml
    <bean id="computer1" class="indi.chester.spring.ioc.entity.Computer">
        <constructor-arg name="brand" value="联想"/>
        <constructor-arg name="type" value="台式机"/>
        <constructor-arg name="sn" value="20160000"/>
        <constructor-arg name="price" value="6000"/>
    </bean>

    <bean id="company" class="indi.chester.spring.ioc.entity.Company">
        <property name="rooms">
            <!-- set 标签 底层是 LinkedHashSet,map 标签 底层是 LinkedHashMap, List 标签底层则是 ArrayList -->
            <set>   <!-- 若 rooms 为 List, 则应该使用 <list> 标签 -->
                <value>2001-总裁办公室</value>
                <value>2002-会议室</value>
            </set>
        </property>

        <property name="computers">
            <!-- set 标签 底层是 LinkedHashSet,map 标签 底层是 LinkedHashMap, List 标签底层则是 ArrayList -->
            <map>
                <entry key="dev-88172" value-ref="computer1" />
                <entry key="dev-88173">
                    <bean class="indi.chester.spring.ioc.entity.Computer">
                        <constructor-arg name="brand" value="戴尔"/>
                        <constructor-arg name="type" value="笔记本"/>
                        <constructor-arg name="sn" value="20160001"/>
                        <constructor-arg name="price" value="5000"/>
                    </bean>
                </entry>
            </map>
        </property>

        <property name="info">
            <props>
                <prop key="phone">0755-12345678</prop>
                <prop key="address">深圳市南山区XX路XX号</prop>
            </props>
        </property>
    </bean>
```

## 总结一下：

### 注入 List:

```xml
<bean id="..." class="...">
    <property name="someList">
        <list>    
            <value>具体值</value>
            <ref bean="otherBeanId"></ref>
        </list>
    </property>
</bean>
```

### 注入 Set

```xml
<bean id="..." class="...">
    <property name="someSet">
        <list>    
            <value>具体值</value>
            <ref bean="otherBeanId"/>
        </list>
    </property>
</bean>
```

### 注入 Map

```xml
<bean id="..." class="...">
    <property name="someMap">
        <map>    
            <entry key="k1" value="v1" />
            <entry key="k2" value-ref="beanId" />
        </map>
    </property>
</bean>
```

### 注入 Properties

```xml
<bean id="..." class="...">
    <property name="someProperties">
        <props>    
            <entry key="k1" value="v1" />
            <entry key="k2" value="v2" />
        </props>
    </property>
</bean>
```
