spring ioc使用示例

IoC全名Inversion of Control,中文为控制反转,DI全名Dependency Inversion。Spring所采用的是Dependency Injection来实现IoC。
依赖注入的意义是:保留抽象接口,让组件依赖于抽象接口,当组件要与其它实际的对象发生依赖关系时,藉过抽象接口来注入依赖的实际对象,形象地来说,即由容器动态的将某种依赖关系注入到组件之中。
有张关于IOC的图,我忘了在哪看到的,觉得很不错就保留下来了,看一看:

再举个例子加深理解:

    有两个类personOne、personTwo,personTwo中有个drink()方法(非静态方法),现在要在personOne类调用personTwo中的drink()方法?


第一种方法不使用IOC:

//personOne中创建personTwo的实例并调用方法。

	public class PersonOne implements IPersonOneDao{
		@Override
		public void eat() {
			IPersonTwoDao personTwo = new PersonTwo();
			personTwo.drink();	
		}
	}

第二种方法使用IOC:

public class PersonOne implements IPersonOneDao{
		private IPersonTwoDao personTwo;
		public void setPersonTwo(IPersonTwoDao personTwo) {
			this.personTwo = personTwo;
		}

		@Override
		public void eat() {
			personTwo.drink();	
		}
	}
配置文件:

<bean id="personOne" class="com.test.PersonOne">
		<property name="personTwo" ref="personTwo"></property>
	</bean>

比较:
第一种方法:personTwo实例化的过程需要开发人员自行处理。
第二种方法:personTwo实例化的过程由IOC容器完成。
personOne在添加personTwo这个依赖时的方式反转了,成为依赖反转。.


接下来,IOC的使用:
写一个简单的程序:
IPersonOneDao.java:

package com.test;

public interface IPersonOneDao {
	void eat();
}
PersonOne.java:

package com.test;
import java.util.List;
import java.util.Map;

public class PersonOne implements IPersonOneDao{
	private IPersonTwoDao personTwo;
	
	private String name;
	private String testNull;
	private Map<String,String> testMap;
	private List<String> testList;
	
	//set注入 与bean.xml 中对应
//	public void setPersonTwo(IPersonTwoDao personTwo) {
//		this.personTwo = personTwo;
//	}
	//构造方法注入 与bean.xml 中对应
	public PersonOne(IPersonTwoDao personTwo) {
		this.personTwo = personTwo;
	}
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTestNull() {
		return testNull;
	}

	public void setTestNull(String testNull) {
		this.testNull = testNull;
	}	
	
	public Map<String, String> getTestMap() {
		return testMap;
	}

	public void setTestMap(Map<String, String> testMap) {
		this.testMap = testMap;
	}

	public List<String> getTestList() {
		return testList;
	}

	public void setTestList(List<String> testList) {
		this.testList = testList;
	}

	@Override
	public void eat() {
		IPersonTwoDao personTwo = new PersonTwo();
		personTwo.drink();
		System.out.println("PersonOne......eat......");
		System.out.println("string: " + this.name);
		System.out.println("testNull: " + this.testNull);
		System.out.println("testMap: "+this.testMap);
		System.out.println("testList: "+this.testList);
	}
}

IPersonTwoDao.java:

package com.test;

public interface IPersonTwoDao {
	void drink();
}

PersonTwo.java

package com.test;

public class PersonTwo implements IPersonTwoDao{
	
	
	@Override
	public void drink() {
		System.out.println("PersonTwo......drink......");
	}	
}

bean.xml:

<bean id="personOne" class="com.test.PersonOne">
	//set注入
<!-- 		<property name="personTwo" ref="personTwo"></property> -->
	//构造方法注入
		<constructor-arg ref="personTwo" />
		
		<property name="name">
			<value>HeLLo</value>
		</property>
		<property name="testNull">
			<null></null>
		</property>
		<property name="testList">
			<list>
				<value>11</value>
				<value>22</value>
			</list>
		</property>
		<property name="testMap">
			<map>
				<entry key="a">
					<value>aa</value>
				</entry>
				<entry key="b">
					<value>bb</value>
				</entry>
			</map>
		</property>
		
	</bean>
	
	<bean id="personTwo" class="com.test.PersonTwo"/>
测试类:
public static void main(String[] args) {
		ApplicationContext context = new FileSystemXmlApplicationContext("bean.xml");
		PersonOne person = (PersonOne)context.getBean("personOne");
		person.eat();
	}

bean.xml中属性介绍:
1. id
Java Bean在BeanFactory中的唯一标识
2. class
Java 类全路径名称
3. singleton(默认单例模式)
指定此Java Bean是否采用单例(Singleton)模式,如果设为“true”,则在BeanFactory作用范围内,只维护此Java Bean的一个实例,代码通过BeanFactory获得此Java Bean实例的引用。反之,如果设为“false”,则通过BeanFactory获取此Java Bean实例时,BeanFactory每次都将创建一个新的实例返回。
4. init-method
初始化方法,此方法将在BeanFactory创建JavaBean实例之后,在向应用层返回引用之前执行。一般用于一些资源的初始化工作。
5. destroy-method
销毁方法。此方法将在BeanFactory销毁的时候执行,一般用于资源释放。
6. <value>
通过<value/>节点可指定属性值。BeanFactory将自动根据Java Bean对应的属性类型加以匹配。注意<value></value>代表一个空字符串,如果需要将属性值设定为null,必须使用<null/>节点。
7.<ref>
指定了属性对BeanFactory中其他Bean的引用关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值