控制反转(IOC)与依赖注入(DI)
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类的实例化;是主动发起,这个应该就是正向; 所以,控制反转的概念可以理解为:被动的接受依赖对象(与原来的:对象是主动去创建(获取)依赖对象 这种方式形成一种反转); 而后引出一个被动接受依赖对象的方式:依赖注入;依赖注入也是更好的理解控制反转的概念,例如以下的代码: private B b ; 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方法); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |