控制反转

 

控制反转(Inversion of Control,英文缩写为IoC): 用来削减计算机程序的耦合问题,也是Spring框架的核心。控制反转还有一个名字叫做依赖注入(Dependency Injection)简称DI

控制反转IoC (Inversion of Control),把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的控制反转概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

 

企业程序一般都是由两个以上的类通过彼此间的合作来完成业务逻辑,这使得每个类都需要创建其合作类(它所依赖的对象)的引用。如果这个获取过程要靠自身实现,将导致代码高度耦合并且难以维护(牵一发而动全身)。

 

IoC 亦称为 依赖倒置原理”("Dependency Inversion Principle")

控制反转: 对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。

       控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

 

设计模式

  IoC就是IoC,不是什么技术,而是一种设计模式。

  Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:

  AInterface a = new AInterfaceImpl(); 这样一来,耦合关系就产生了,如:

  Class A{

    AInterface a;

    method(){

      a = new AInterfaceImpl();

    }

  }

  类AAInterfaceImpl就是依赖关系,如果想使用AInterface的另外一个实现就需要更改代码了。当然我们可以建立一个Factory来根据条件生成想要的AInterface的具体实现,即:

  class InterfaceImplFactory{

    AInterface create(Object condition){

      if(condition == A){

        return newA AInterfaceImpl();

      } else if(condition == B){

        return new BInterfaceImpl();

      } else{

        return new CInterfaceImpl();

      }

    }

   }

  表面上是在一定程度上缓解了以上问题,但实质上这种代码耦合并没有改变。

  通过IoC模式可以彻底解决这种耦合,它把耦合从代码中移出去,放到统一的XML 文件中,通过一个容器在需要的时候把这个依赖关系生成,即把需要的接口实现注入到需要它的类中,这可能就是依赖注入说法的来源了。

  IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。       

  可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 反射编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

  IoC中最基本的Java技术就是反射编程。

  通俗的说反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。HibernateSpring中都是用反射做为最基本的技术手段。

  反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。

 

优缺点:

  IoC最大的好处是什么?

  因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口)。

  IoC最大的缺点是什么?

  (1) 对象生成因为是使用反射编程,在效率上有些损耗。

    但相对IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。

  (2) 缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。

 

posted on 2016-02-28 22:01  快跑的小鸡  阅读(547)  评论(0)    收藏  举报

导航