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这个类。