Spring中被人使用最多的可能就是他的依赖注入了,比如SSH整合的时候,必然会使用Spring的依赖注入。依赖注入简写DI,全称:Dependency Injection。依赖注入也有另外一个名字叫做控制反转(IOC)。

在讲解Spring的依赖注入的使用之前,我们需要先搞明白什么是依赖注入。接下来举个例子:

一般领导都会有一个秘书,要秘书有什么用呢?估计大家都知道,可以把一些事情交给秘书来做,减少领导的工作量,这样领导有更多精力去处理那些更重要的事情。比如,领导要喝水,如果没有秘书就是自己去倒水,浪费时间;如果有秘书,就是秘书倒好谁递到领导手上,领导就没有毕业为这点小事分心了。

上面例子中的秘书就好比依赖注入的框架,秘书倒好水、泡好茶叶,递给领导。依赖注入框架就是将某个对象(茶水)递给需要此对象(茶水)的对象(领导)。接下来用代码的方式来演示上面的例子。

例子1:领导自己倒水。

创建一个Water类:

package com.androidxx.ioc;
/**
 * 水
 * @author yangjw
 *
 */
public class Water {

	@Override
	public String toString() {
		return "茶水";
	}
}

创建一个Leader类:

package com.androidxx.ioc;
/**
 * 领导
 * @author yangjw
 *
 */
public class Leader {
	/**
	 * 喝水
	 */
	public void drink() {
		//创建水的对象
		Water water = new Water();
		//打印日志,用来表示领导喝水了
		System.out.println("领导喝" + water);
	}

}

测试类LeaderTest:

package com.androidxx.ioc;

import static org.junit.Assert.*;

import org.junit.Test;

public class LeaderTest {

	@Test
	public void test() {
		new Leader().drink();
	}

}

在以上的例子中,Leader中亲自创建的Water对象,就好比领导亲自去倒水喝。这样在程序中就存在领导和水之间的耦合非常大,如果领导现在不想和茶水了,想喝汽水,就需要改Leader类中的源码了。这样在实际开发中非常麻烦,一个类还好说,如果有1000个这样的类需要修改,那程序员会崩溃。如果领导和水之间是通过秘书关联的,那领导就不要亲自去创建Water对象了,至于是要和汽水、咖啡、茶水都交由秘书去办,这样就轻松多了,维护起来就方便多了。接下来看一下有秘书的例子:

例子2:领导要喝水,秘书去倒好,给领导。

此例子在上面的例子1的基础上修改了Leader类和添加了Secretary(秘书)类,Water类不变(同上)。

秘书Secretary类:

package com.androidxx.ioc;
/**
 * 秘书
 * @author yangjw
 *
 */
public class Secretary {
	/**
	 * 倒水的行为
	 * @return 准备好的水
	 */
	public Water getWater() {
		return new Water();
	}
}

领导Leader类:

package com.androidxx.ioc;
/**
 * 领导
 * @author yangjw
 *
 */
public class Leader {
	/**
	 * 喝水
	 */
	public void drink(Water water) {
		//打印日志,用来表示领导喝水了
		System.out.println("领导喝" + water);
	}

}

测试类:

package com.androidxx.ioc;

import static org.junit.Assert.*;

import org.junit.Test;

public class LeaderTest {

	@Test
	public void test() {
		//秘书去倒水
		Water water = new Secretary().getWater();
		//倒好的水交给领导(注入给领导)
		new Leader().drink(water);
	}

}

以上例子,可以看到Water类已经不在Leader类中创建了,这样Leader和Water就没有耦合了,而是将Water交由Secretaty创建,Secretary创建好之后交给Leader。这就是依赖注入。

为了没有任何杂质、简洁的介绍依赖注入的概念,以上的例子非常的简单。所以,可能有人会问,这样看不出有什么好处啊。确实,就以上例子而言看不到好处;但是一个项目不可能这么简单。本案例也只是希望能让你理解什么是依赖注入,至于依赖注入的好处就是解耦,不用花太多精力去关心对象的创建和维护。
Spring的DI功能就是充当上面案例中的秘书角色,也就是我们可以使用Spring的DI模块去替换Secretary这个类。