您的位置:首页 > 其它

控制反转(IOC)与依赖注入(DI)

2014-04-21 14:05 387 查看
IOC 和DI,这两个在Java中指的是控制反转和依赖注入;熟悉struts2 , spring的人对于这两个名词都很不陌生;

最近在学习的过程中,又不断的碰到这两个词;而网络上,更多的是对依赖注入的方式进行了说明;而很少提到具体什么是IOC和DI;在此蛮说一下自己对这两个的理解;

依赖注入、控制反转;提到这两个概念,必须首先了解什么是依赖;

依赖:"依赖描述了两个模型元素之间的关系,如果被依赖的模型元素发生变化就会影响到另一个模型元素。典型的,在类图上,依赖关系表明客户类的操作会调用服务器类的操作。"这个是UML工具Rose帮助文档上面的描述;

按照我个人的理解,如果A类中有使用到B类的实例,并通过B类的实例,调用了B的方法,或者B的属性;那么A就有依赖于B;例如以下的代码:

Class A {

private B b = new B();

public void dosome(){

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方法);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: