上一篇博客中通过Spring配置文件给生成的对象实例的属性进行了赋值。但是那里面类的属性都是一些基本类型,而实际应用中类的属性可能是其它类的对象,也可能是集合类型。这一篇博客讲述如何给类对象属性以及集合属性进行赋值。
1.新建工程:Spring402-03;
2.新建一个类:
package com.test.entity;
public class People {
private int id;
private String name;
private int age;
public People() {
super();
// TODO Auto-generated constructor stub
}
public People(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
这个类中的属性都是基本类型。
3.修改Spring配置文件,生成一个bean对象:
<?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.xsd">
<bean id="people1" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
</bean>
</beans>
这里通过属性注入的方法,给People类的一个对象实例中的属性进行了赋值。
4.写一个Junit测试方法:
package com.test.test;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.test.entity.People;
public class Test2 {
private ApplicationContext ac;
@Before
public void setUp() throws Exception {
ac = new ClassPathXmlApplicationContext("beans.xml");
}
@After
public void tearDown() throws Exception {
}
@Test
public void test1() {
People people = (People) ac.getBean("people1");
System.out.println(people);
}
}
运行这个测试方法:
这里通过上一讲讲过的属性注入的方式给People类中的基本类型属性进行了赋值。
二、注入bean
一个类中的元素也可能是一个其它类的对象,现在看一下如何对这种对象元素赋值。
1.新建一个类Dog:
package com.test.entity;
public class Dog {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.使用Spring来管理这个Dog类,Spring配置文件中添加关于Dog类的配置:
<bean id="dog1" class="com.test.entity.Dog">
<property name="name" value="Jack"></property>
</bean>
这里定义了一个名字为Jack的Dog对象。
3.修改People类如下:
package com.test.entity;
public class People {
private int id;
private String name;
private int age;
private Dog dog;
public People() {
super();
// TODO Auto-generated constructor stub
}
public People(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", dog=" + dog.getName() + "]";
}
}
这里给People类添加了一个Dog对象元素,并重写了toString方法。
4.Spring配置文件中定义一个这个类的对象:
<bean id="people2" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog" ref="dog1"></property>
</bean>
这里定义了一个People类的对象,使用属性注入方法对People类中的基本类型属性进行了赋值。这里给dog属性赋值时还是使用<property>标签,里面name属性值要和People类中定义的Dog类对象名相同,使用ref属性(引用)来给dog对象赋值,这里dog的值引用的是上面定义的那个dog1对象。
5.写测试方法:
//注入bean
@Test
public void test2() {
People people = (People) ac.getBean("people2");
System.out.println(people);
}
运行测试方法:
这里People类中的dog对象赋值成功。
三、注入内部bean
上面的注入方法是先定义Dog类对象,然后使用<property>标签的ref属性来给dog对象赋值。这种方法的一个缺陷是Spring中定义的所有的People类对象都可以引用这个Dog对象,也就是所有人都有一个叫Jack的狗,这显然是不符合逻辑的。下面使用注入内部bean的方式来一个People对象注入一个独有的dog对象值。修改Spring配置文件,定义一个新的People对象:
<bean id="people3" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog">
<bean class="com.test.entity.Dog">
<property name="name" value="Tom"></property>
</bean>
</property>
</bean>
这里使用注入内部bean的方式定义了一个People对象,这个里面定义了一个名为Tom 的狗。
写测试方法:
//注入内部bean
@Test
public void test3() {
People people = (People) ac.getBean("people3");
System.out.println(people);
}
运行测试方法:
还有一种情况是有的人没有狗,这个时候dog对象的值为空。修改Spring配置文件,定义一个dog对象为空的People对象:
<bean id="people4" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog">
<null></null>
</property>
</bean>
这里要使用<null>标签给dog对象赋值为null。
写测试函数:
//注入null
@Test
public void test4() {
People people = (People) ac.getBean("people4");
System.out.println(people);
}
运行测试方法:
Spring还支持级联属性赋值。示例如下,新建一个People类对象:
<bean id="people5" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog.name" value="Jack2"></property>
</bean>
这里使用级联属性直接给dog对象的name属性赋值。这种赋值方式并不常用,使用这种方式赋值的时候会调用dog对象的set方法给name赋值,因此使用这种方式在People类中要new一个dog对象,修改People类为:
private int id;
private String name;
private int age;
private Dog dog = new Dog();
写测试方法:
//级联注入
@Test
public void test5() {
People people = (People) ac.getBean("people5");
System.out.println(people);
}
运行测试方法:
四、集合类型属性
介绍Spring如何给集合对象赋值。最常用的集合对象有List,Set和Map。
1.List集合赋值
给People类新添加一个属性:
private List<String> hobbies = new ArrayList<String>();
生成这个属性的get和set方法,重写toString方法为:
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", dog=" + dog.getName() + ", hobbies=" + hobbies + "]";
}
使用Spring定义一个新的People对象:
<bean id="people6" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog" ref="dog1"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
</bean>
这里使用<list>标签给List集合对象赋值。
定义新的测试方法:
//注入List集合
@Test
public void test6() {
People people = (People) ac.getBean("people6");
System.out.println(people);
}
运行测试方法:
2.Set集合注入
在People类中新添加一个Set集合对象:
private Set<String> loves = new HashSet<String>();
生个这个对象的get和set方法,重写toString方法:
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", dog=" + dog.getName() + ", hobbies=" + hobbies
+ ", loves=" + loves + "]";
}
Spring生成一个新的People对象:
<bean id="people7" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog" ref="dog1"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
<property name="loves">
<set>
<value>唱歌2</value>
<value>跳舞2</value>
</set>
</property>
</bean>
写测试方法:
//注入Set集合
@Test
public void test7() {
People people = (People) ac.getBean("people7");
System.out.println(people);
}
运行测试方法:
3.注入Map集合对象
People类中新添加一个Map集合对象:
private Map<String,String> works = new HashMap<String,String>();
生成这个对象的get和set方法,并重写toString方法:
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", dog=" + dog.getName() + ", hobbies=" + hobbies
+ ", loves=" + loves + ", works=" + works + "]";
}
Spring中新建一个People对象:
<bean id="people8" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog" ref="dog1"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
<property name="loves">
<set>
<value>唱歌2</value>
<value>跳舞2</value>
</set>
</property>
<property name="works">
<map>
<entry>
<key><value>上午</value></key>
<value>写代码</value>
</entry>
<entry>
<key><value>下午</value></key>
<value>测试代码</value>
</entry>
</map>
</property>
</bean>
写测试方法:
//注入Map集合
@Test
public void test8() {
People people = (People) ac.getBean("people8");
System.out.println(people);
}
运行测试方法:
4.Properties集合
People中新添加一个Properties集合对象:
private Properties addresses = new Properties();
生成这个对象的get和set方法,重写toString方法:
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", dog=" + dog.getName() + ", hobbies=" + hobbies
+ ", loves=" + loves + ", works=" + works + ", addresses=" + addresses + "]";
}
修改String测试对象people8:
<bean id="people8" class="com.test.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog" ref="dog1"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
<property name="loves">
<set>
<value>唱歌2</value>
<value>跳舞2</value>
</set>
</property>
<property name="works">
<map>
<entry>
<key><value>上午</value></key>
<value>写代码</value>
</entry>
<entry>
<key><value>下午</value></key>
<value>测试代码</value>
</entry>
</map>
</property>
<property name="addresses">
<props>
<prop key="address1">aaaa</prop>
<prop key="address2">bbbb</prop>
</props>
</property>
</bean>
运行测试方法test8:
可以看到Properties和Map长得很像,Properties一般用于存储系统的配置信息。