前面我们已经讲解了简单类型的注入方式,现在让我们来看看复杂类型的注入方式。
首先看看我们需要用到的 bean
public class Book {
private String name;
private String author;
// getter/setter...
// toString()...
}
public class Car {
private String name;
private String color;
private Double price;
// getter/setter...
// toString()...
}
public class Person {
private String name;
private String gender;
private Integer age;
private String email;
private Car car;
private List<Book> bookList;
private Map<String, Object> map;
private Properties properties;
// getter/setter...
// toString()...
}
注入对象
现在,我想要一辆车,我们该如何在person中注入 car 的属性呢?
<bean id="car01" class="spring.bean.Car">
<property name="name" value="宝马"></property>
<property name="color" value="红色"></property>
<property name="price" value="300000"></property>
</bean>
<bean id="person01" class="spring.bean.Person">
<property name="gender" >
<null></null>
</property>
<property name="car" ref="car01"></property>
</bean>
- ref:表示引入外部属性
我们在 ioc 容器中注册两个组件,然后 在 Person 组件中引用 Car 组件。现在,让我们考虑这样一个问题:我修改 Person 组件中的 Car 的属性,会不会造成 Car 组件中的属性改变呢?
@Test
public void test() {
Person person01 = (Person) context.getBean("person01");
Car car01 = (Car) context.getBean("car01");
System.out.println(car01);
person01.getCar().setName("永久");
System.out.println(car01);
}
Car{name=‘宝马’, color=‘红色’, price=300000.0}
Car{name=‘永久’, color=‘红色’, price=300000.0}
我们看到,当我们修改 Person 中的 car 的属性的时候,ioc 容器中的 car 也会发生变化(真是一夜回到解放前啊)。
想要获取car,我们也可以这样写:
<bean id="person01" class="spring.bean.Person">
<property name="gender" >
<null></null>
</property>
<property name="car">
<bean class="spring.bean.Car">
<property name="name" value="宝马"></property>
<property name="color" value="红色"></property>
<property name="price" value="300000"></property>
</bean>
</property>
</bean>
这样我们就不怕 ioc 容器中的 car 被修改啦
注入集合
注入 list 集合
<bean id="book01" class="spring.bean.Book">
<property name="name" value="三国演义"></property>
<property name="author" value="罗贯中"></property>
</bean>
<bean id="person02" class="spring.bean.Person">
<property name="bookList">
<list>
<bean class="spring.bean.Book" p:name="西游记" p:author="吴承恩"></bean>
<!--引用一个外部对象-->
<ref bean="book01"></ref>
</list>
</property>
</bean>
这里,我们使用了 list 标签为 bookList 赋值。在 list 里面,我们又用两种方法给 book赋值,一种方法时使用 p 名称空间,还有一种方法是通过 ref 标签引入一个外部对象。
注入 map 集合
<bean id="person03" class="me.crw.spring.bean.Person">
<property name="map">
<map>
<entry key="name" value="张三"></entry>
<entry key="age" value="18"></entry>
<entry key="books" value-ref="book01"></entry>
<entry key="car">
<bean class="me.crw.spring.bean.Car">
<property name="name" value="宝马"></property>
</bean>
</entry>
<entry key="array">
<array>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
</array>
</entry>
</map>
</property>
</bean>
这里,我们使用了 map 标签为 map赋值。在 map 里面,我们用 entry 来给键值对赋值。这个键可以是普通类型,也可以是对象,也可以是集合。
注入 Property
<bean id="person04" class="spring.bean.Person">
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
在这里,我们使用了 标签表明我们要为 property 类型的属性赋值,在标签中,我们用 来为具体的属性赋值