选择题 8.  下列关于依赖注入的描述中,正确的是______。
【正确答案】 A、C、D
【答案解析】 IoC(Inverse of Control,控制反转)有时候也被叫作依赖注入,是一种降低对象之间耦合关系的设计思想。一般而言,在分层体系结构中,都是上层调用下层的接口,上层依赖于下层的执行,即调用者依赖于被调用者。而通过IoC方式,使得上层不再依赖于下层的接口,即通过采用一定的机制来选择不同的下层实现,完成控制反转,使得由调用者来决定被调用者。IoC通过注入一个实例化的对象来达到解耦和的目的。使用这种方法后,对象不会被显式地调用,而是根据需求通过IoC容器(例如Spring)来提供。
   采用IoC机制能够提高系统的可扩展性,如果对象之间通过显式地调用进行交互,那么会导致调用者与被调用者存在着非常紧密的联系,其中一方的改动将会导致程序出现很大的改动。例如,要为一家卖茶的商店提供一套管理系统,在这家商店刚开业的时候只卖绿茶(Green Tea),随着规模的扩大或者根据具体销售量,未来可能会随时改变茶的类型,例如红茶(Black Tea)等,传统的实现方法会针对茶抽象化一个基类,绿茶类只需要继承自该基类即可。如图1所示。
   

   图1  实现方法1

   采用该实现方法后,在需要使用GreenTea的时候,只需要执行以下代码即可:AbstractTea t=newGreenTea(),当然,这种方法是可以满足当前设计要求的。但是该方法的可扩展性不好,存在着不恰当的地方,例如,当商家发现绿茶的销售并不好,决定开始销售红茶时,那么只需要实现一个BlackTea类,并且让这个类继承自AbstractTea即可。但是,在系统中所有用到AbstractTea t=new GreenTea()的地方,都需要被改为AbstractTea t=new.BlackTea(),而这种创建对象实例的方法往往会导致程序的改动量非常大。
   那么怎样才能增强系统的可扩展性呢?此时可以使用设计模式中的工厂模式来把创建对象的行为包装起来,实现方法如图2所示。
   

   图2  实现方法2

   通过以上方法,可以把创建对象的过程委托给TeaFatory来完成,在需要使用Tea对象的时候,只需要调用Factory类的getTea方法即可,具体创建对象的逻辑在TeaFactory中来实现,那么当商家需要把绿茶替换为红茶的时候,系统中只需要改动TeaFactory中创建对象的逻辑即可。当采用了工厂模式后,只需要在一个地方做改动就可以满足要求,从而增强了系统的可扩展性。
   虽然说采用工厂设计模式后增强了系统的可扩展性,但是从本质上来讲,工厂模式只不过是把程序中会变动的逻辑移动到工厂类里面了,当系统中的类较多的时候,在系统扩展的时候需要经常改动工厂类中的代码。而采用IoC设计思想后,程序将会有更好的可扩展性,下面主要介绍Spring框架在采用IoC后的实现方法,如图3所示。