IoC全名Inversion of Control,中文为控制反转,DI全名Dependency Inversion。Spring所采用的是Dependency Injection来实现IoC。
依赖注入的意义是:保留抽象接口,让组件依赖于抽象接口,当组件要与其它实际的对象发生依赖关系时,藉过抽象接口来注入依赖的实际对象,形象地来说,即由容器动态的将某种依赖关系注入到组件之中。
有张关于IOC的图,我忘了在哪看到的,觉得很不错就保留下来了,看一看:
再举个例子加深理解:
第二种方法使用IOC:
比较:
第一种方法:personTwo实例化的过程需要开发人员自行处理。
第二种方法:personTwo实例化的过程由IOC容器完成。
personOne在添加personTwo这个依赖时的方式反转了,成为依赖反转。.
接下来,IOC的使用:
写一个简单的程序:
IPersonOneDao.java:
IPersonTwoDao.java:
PersonTwo.java
bean.xml:
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的引用关系。
依赖注入的意义是:保留抽象接口,让组件依赖于抽象接口,当组件要与其它实际的对象发生依赖关系时,藉过抽象接口来注入依赖的实际对象,形象地来说,即由容器动态的将某种依赖关系注入到组件之中。
有张关于IOC的图,我忘了在哪看到的,觉得很不错就保留下来了,看一看:
再举个例子加深理解:
有两个类personOne、personTwo,personTwo中有个drink()方法(非静态方法),现在要在personOne类调用personTwo中的drink()方法?
//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的引用关系。