IOC 和DI,这两个在Java中指的是控制反转和依赖注入;熟悉struts2 , spring的人对于这两个名词都很不陌生; spring
最近在学习的过程当中,又不断的碰到这两个词;而网络上,更多的是对依赖注入的方式进行了说明;而不多提到具体什么是IOC和DI;在此蛮说一下本身对这两个的理解; 设计模式
依赖注入、控制反转;提到这两个概念,必须首先了解什么是依赖; 服务器
依赖:"依赖描述了两个模型元素之间的关系,若是被依赖的模型元素发生变化就会影响到另外一个模型元素。典型的,在类图上,依赖关系代表客户类的操做会调用服务器类的操做。"这个是UML工具Rose帮助文档上面的描述; 网络
按照我我的的理解,若是A类中有使用到B类的实例,并经过B类的实例,调用了B的方法,或者B的属性;那么A就有依赖于B;例如如下的代码: 框架
Class A { 工具
private B b = new B(); 学习
public void dosome(){ this
b.do(); 设计
} 对象
}
控制反转,目的是用于减小模块之间的耦合的一种设计模式;不少的框架(spring, struts2)都有这个原则/模式;Martin Fowler大师提出了"哪些方面的控制被反转了"的问题,而且他总结出来是:依赖对象的得到被反转了;以上面的代码为例:A须要调用B对象的方法,因此在A中申明了B类的实例,并初始化(建立了)一个实例;这个就是依赖对象的得到;再接着说,A由于是调用B,因此A主动发起B类的实例化;是主动发起,这个应该就是正向;
因此,控制反转的概念能够理解为:被动的接受依赖对象(与原来的:对象是主动去建立(获取)依赖对象 这种方式造成一种反转);
然后引出一个被动接受依赖对象的方式:依赖注入;依赖注入也是更好的理解控制反转的概念,例如如下的代码:
Class A {
private B b ;
public void dosome(){
b.do();
}
public void setB(B b){
this.b = b;
}
}
Class B{
public void do(){
System.out.println("b ,do ;");
}
}
Class Container{
public Container(){
B b = new B();
A a = new A();
a.setB(b);//// 注入,A类的对象中,使用的B实例是有Container对象注入的,A没有选择权,是被动的;
}
}
A类使用的B类的实例,是经过container这个类在初始化A对象的时候,注入(设置)到A对象的;对于A对象来讲,它是被动接受的,没有选择权,也没法主动获取。这个就是控制反转了。。而上面代码使用的方式就是依赖注入的一种(基于setter方法);
关于依赖注入的演进能够参考这篇连载 http://haolloyin.blog.51cto.com/1177454/458416