J2EE系列之Spring4学习笔记(四)--IOC详解(参数注入)

来源:互联网 发布:大数据时代要求我们 编辑:程序博客网 时间:2024/06/06 21:53

上一篇博客中通过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;}@Overridepublic 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;@Beforepublic void setUp() throws Exception {ac = new ClassPathXmlApplicationContext("beans.xml");}@Afterpublic void tearDown() throws Exception {}@Testpublic 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;}@Overridepublic 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@Testpublic 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@Testpublic 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@Testpublic 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();
写测试方法:

//级联注入@Testpublic 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方法为:

@Overridepublic 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集合@Testpublic 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方法:

@Overridepublic 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集合@Testpublic 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方法:

@Overridepublic 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集合@Testpublic void test8() {People people = (People) ac.getBean("people8");System.out.println(people);}

运行测试方法:


4.Properties集合

People中新添加一个Properties集合对象:

private Properties addresses = new Properties();
生成这个对象的get和set方法,重写toString方法:

@Overridepublic 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一般用于存储系统的配置信息。



阅读全文
0 0
原创粉丝点击