`

控制反转,依赖注入,好莱坞原则

 
阅读更多

IoC 或者 DI 或者 …一大堆的缩写词 
依赖注入和控制反转其实是同一回事,依赖注入最典型的应用就是控制反转

不管是面向对象,还是面向过程,都需要分成许多的块,然后由这些部件协同工作完成任务 
要协同工作就会产生依赖,一个方法调用另一个方法,一个对象包含另一个对象 
如果对象A包含对象B的话,就需要在A里new一个B 
依赖注入从具体类B里抽象出接口IB——IB的具体实现可能有很多B,B1,B2…很多种——这样A可以不用再new具体的B了,而是跟IoC容器说:我要一个IB(getBean("IB"))。然后,由容器根据配置文件来做具体的new的工作。具体new的是哪个,由配置文件从代码外部决定,要更换成B,B1,或是B2…修改配置文件就能做到,不用再改代码了

例:
假设你编写了两个类,一个是人(Person),一个是手机(Mobile)。 
人有时候需要用手机打电话,需要用到手机的dialUp方法。 
传统的写法是这样:

//code
public class Person
    public boolean makeCall(long number)
        Mobile mobile=new Mobile(); 
        return mobile.dialUp(number); 
    }
 
}

也就是说,类Person的makeCall方法对Mobile类具有依赖,必须手动生成一个新的实例new Mobile()才可以进行之后的工作。 
依赖注入的思想是这样,当一个类(Person)对另一个类(Mobile)有依赖时,不再该类(Person)内部对依赖的类(Moblile)进行实例化,而是之前配置一个beans.xml,告诉容器所依赖的类(Mobile),在实例化该类(Person)时,容器自动注入一个所依赖的类(Mobile)的实例。 
接口

//code
public Interface MobileInterface
    public boolean dialUp(long number);
}


Person类:

//code
public class Person{
    private MobileInterface mobileInterface;
    public boolean makeCall(long number){
        return this.mobileInterface.dialUp(number);
    }

    public void setMobileInterface(MobileInterface mobileInterface){
        this.mobileInterface=mobileInterface;
    }

}


在xml文件中配置依赖关系

//code
<bean class="Person" id="person">
     <property name="mobileInterface">
         <ref local="mobileInterface"></ref>
     </property>
</bean> 
<bean class="Mobile" id="mobileInterface"></bean>

这样,Person类在实现拨打电话的时候,并不知道Mobile类的存在,它只知道调用一个接口MobileInterface,而MobileInterface的具体实现是通过Mobile类完成,并在使用时由容器自动注入,这样大大降低了不同类间相互依赖的关系。

什么叫控制反转呢? 
套用好莱坞的一句名言就是:你呆着别动,到时我会找你。 
什么意思呢?就好比一个皇帝和太监 
有一天皇帝想幸某个美女,于是跟太监说,今夜我要宠幸美女 
皇帝往往不会告诉太监,今晚几点会回宫,会回哪张龙床,他只会告诉太监他要哪位美女 
其它一切都交由太监去安排,到了晚上皇帝回宫时,自然会有美女出现在皇帝的龙床上 
这就是控制反转,而把美女送到皇帝的寝宫里面去就是注射 
太监就是是框架里面的注射控制器类BeanFactory,负责找到美女并送到龙床上去 
整个后宫可以看成是Spring框架,美女就是Spring控制下的JavaBean 
而传统的模式就是一个饥渴男去找小姐出台 
找领班,帮助给介绍一个云云,于是领班就开始给他张罗 
介绍一个合适的给他,完事后,再把小姐还给领班,下次再来 
这个过程中,领班就是查询上下文Context,领班的一个职能就是给客户找到他们所要的小姐 
这就是lookup()方法,领班手中的小姐名录就是JNDI//Java Naming and Directory Interface 
小姐就是EJB,饥渴男是客户端,青楼是EJB容器 
看到区别了么?饥渴男去找小姐出台很麻烦,不仅得找,用完后还得把小姐给还回去 
而皇帝爽翻了,什么都不用管,交给太监去处理,控制权转移到太监手中去了 
而不是皇帝,必要时候由太监给注射进去就可以了 
看到Spring的美妙了吧,Spring还提供了与多个主流框架的支持 
可以和其它开源框架集成 

分享到:
评论

相关推荐

    控制反转-依赖注入详解

    控制反转(IoC)和依赖注入(DI)是软件设计模式中的重要概念,主要用于降低组件间的耦合度,提高代码的可维护性和可扩展性。IoC的核心思想是将对象的创建和管理交给一个外部容器,而不是由对象自身负责,从而实现...

    向依赖关系宣战--依赖倒置、控制反转和依赖注入辨析

    依赖倒置、控制反转和依赖注入是面向对象编程中用于减少模块间耦合的重要原则,它们都是为了提高软件系统的灵活性和可维护性。在本文中,我们将深入探讨这些概念及其在实际应用中的区别。 首先,依赖倒置原则...

    MVC 控制反转详解

    总的来说,控制反转和依赖注入是现代软件开发中的重要概念,它们帮助我们构建松耦合、高内聚的系统,增强代码的可测试性和可扩展性。通过合理地运用这些设计原则,可以大大提高软件的质量和维护效率。

    在Eclipse RCP中实现控制反转(IoC).doc

    控制反转(Inversion of Control,IoC)和依赖注射(Dependency Injection,DI)是面向对象编程中降低模块间耦合的技术,遵循“好莱坞原则”,即组件不再自行创建和管理依赖,而是由一个外部容器或框架负责管理和...

    Spring相关设计思想解析IOC DI DL DP.doc

    Spring框架是Java领域中极为重要的轻量级框架,它引入了控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)等核心设计思想,使得应用程序的构建更加灵活、解耦。本文将深入解析...

    Spring框架中的ioc的幽默解释

    在Java开发中,控制反转意味着不再由类内部直接创建所需的依赖对象,而是通过配置或者依赖注入让外部容器来创建和提供这些对象。这样,类不再直接控制其依赖项,而是依赖于容器来传递这些依赖。 文章通过一个生动的...

    Spring容器研究.pdf

    ### Spring容器研究 ...综上所述,Spring容器不仅提供了强大的依赖注入和控制反转功能,还通过AOP支持了横切关注点的分离。同时,Spring还能够与Hibernate和EJB等技术很好地集成,为Java应用提供了全面的支持。

    J2EE企业级项目开发-3期(KC007) 7.2 精解Spring之IoC原理与具体使用文档.docx

    - **好莱坞法则**:对象不再主动寻找资源,而是由Spring容器按需提供,符合"别找我们,我们找你"的设计原则。 **Spring中IoC的实现:** 1. **Bean定义**:在Spring配置文件中,通过bean标签定义对象及其属性,包括...

    Spring IOC:找对象的一次革命(1)

    3. **好莱坞原则**:遵循"Don't call us, we'll call you"的原则,对象不需要主动去寻找依赖,而是等待容器将依赖注入进来,这使得对象的设计更加优雅和简洁。 ### IoC的缺点 1. **依赖于IoC容器**:虽然IoC减少了...

    07 别整虚的!揭开Spring IoCDI的神秘面纱慕课专栏1

    依赖注入是控制反转(Inversion of Control,简称IoC)思想的一个具体实现,这一思想源于好莱坞原则,即“不要给我们打电话,我们会给你打电话”。在软件设计中,IoC意味着将组件的初始化和调用控制权从组件本身转移...

    Spring Framework常用面试题及答案汇总

    IOC是控制反转,类似于好莱坞原则(你不要打电话给我,我会打电话给你),主要包含依赖查找和依赖注入。IOC容器管理、依赖注入、依赖查找AOP抽象事物抽象事件机制SPI扩展强大的第三方整合易测试性等。 四、依赖注入...

    14 离开了Spring,IoC容器还可以怎么做?慕课专栏1

    通过这种方式,对象不再需要自己创建依赖,而是由容器负责实例化、定位和配置,遵循“好莱坞原则”,即“别找我,我会找你”。 2. **Spring的IoC容器**:Spring框架中的IoC容器负责管理对象的生命周期,包括初始化...

    理解Java当中的回调机制

    控制反转(IoC)是回调机制背后的理论基础,它打破了传统的程序流程控制,将对象的创建和依赖关系的管理交给了外部容器或框架,而不是由对象自身负责。这样降低了代码间的耦合,提高了可扩展性和可维护性。在Java中...

Global site tag (gtag.js) - Google Analytics