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

上一篇博客中通过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一般用于存储系统的配置信息。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值