IoC概述
IoC(控制反转,Inverse of control)是spring的内核,它将类和类之间的依赖关系从代码中脱离出来,用配置的方式进行依赖关系描述,由容器负责依赖类之间的创建、拼接、管理、获取等工作。
**
通过实例理解IoC概念
看过《墨攻》这部电影的读者可能记得这样一个场景:当刘德华所饰演的墨者革离到达梁国都城下,城上梁国守军问道:”来着何人”,刘德华回答:“墨者革离!”。我们就以一个java类为这个“城门叩问”的场景进行编剧,借此理解IoC的概念。
定义主角刘德华类:
public class LiuDeHua {
//应答
public void responseAsk(String str){
System.out.println(str);
}
}
定义墨攻场景类:
public class MoAttack {
//城门叩问
public void cityGateAsk(){
System.out.println("来着何人?");
//注释1:演员直接侵入剧本
LiuDeHua ldh = new LiuDeHua();
ldh.responseAsk("墨者革离!");
}
}
从注释1处可以看出,作为具体饰演者的刘德华直接侵入到剧本,剧本和演员直接耦合在一起。
作为一个明智的编剧在剧情创造时应围绕故事的角色进行,而不应考虑角色的具体饰演者这样才能在拍摄时自由的选择任何合适的演员,而非绑定在刘德华一人身上,通过以上分析,我们可以为主人公革离定义一个接口:
public interface GeLi {
public void responseAsk(String str);
}
修改墨攻场景类:
public class MoAttack {
//城门叩问
public void cityGateAsk(){
System.out.println("来着何人?");
//注释1:引入革离角色接口
GeLi geli = new LiuDeHua();
//注释2:通过接口开展剧情
geli.responseAsk("墨者革离!");
}
}
在注释1处引入了角色,通过角色展示剧本情节,在拍摄时角色由演员饰演,此时三者之间关系如下:
从上图我们可以看出,MoAttack 同时依赖于GeLi接口和LiudeHua类,并没有达到我们期待的剧本仅仅依赖于角色的目的。但是角色最终必须通过具体的演员才能完成拍摄,如何让LiuDeHua和剧本无关而有能完成GeLi的具体动作呢?那就是在影片拍摄时,导演将LiuDeHua安排在GeLi的角色上,导演将剧本、角色、饰演者装配起来:
通过导演的引入,使剧本和具体饰演者解耦,对应到软件中,导演像是一个装配器,安排演员表演具体的角色。
现在我们反过来理解IoC的概念,IoC的字面意思是控制反转,它包含两个内容:1、控制 2、反转。
对应到前面的例子,“控制”是指选择GeLi角色扮演着的控制权;
“反转”:是指这种控制权从《墨攻》剧本中移除,转交到导演手中,而这个导演可以称为第三方容器或者协作类(我们知道spring也是一个容器)。对于软件来说,即是某一接口具体实现类的选择权从调用类中移除,转交给第三方决定。
此例子借助于《spring3.x企业应用开发实战》,分享给大家,希望大家能对IoC有深入理解。