Spring中的IOC/DI思想

来源:互联网 发布:cr2打开软件 编辑:程序博客网 时间:2024/06/06 19:11

    IoC就是有容器(注意容器的概念,是应用程序的运行环境)控制程序之间的关系,传统的实现中是由程序代码控制程序之间的关系,即组件之间的依赖关系由容器在运行期决定,即容器(也就是运行环境)带台地将某种依赖关系注入到组件之中(白话理解是运行环境在程序执行过程中动态地将组件需要的资源提供给组件)。这也是控制反转的概念,即控制权(程序之间的依赖关系)由程序代码中转移到了外部容器;

    依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,为系统搭建一个灵活,可扩展的平台,通过依赖注入和控制反转很好地实现组件之间的松耦合,从而利于组件的复用,实现真正意义上的即插即用。

 

   依赖注入的几种实现类型:

  1.接口注入

     不常使用,不够灵活 典型:Apache Avalon

  2.设置注入:通过类的setter方法完成依赖关系的设置;典型:Spring

  3.构造注入:通过构造函数完成依赖关系的设定;典型:PicoContainer

 

   几种注入模式的对比:

   a. 设值注入

    (1)习惯JavaBean开发的程序员通过设值注入更加直观,自然;

    (2)若依赖关系比较复杂,则构造注入的构造函数会相当庞大,因为需要在构造函数中设定所有依赖关系,使用设值注入会更为简洁;

    (3)对于某些第三方类库而言,可能要求组件必须提供一个默认的构造函数(如struts中的Action),此时构造注入就会体现出局限性;

 

b.构造注入

    (1)构造期即创建一个完整、合法的对象;

    (2)避免了繁琐的set方法编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,更加易读;

    (3)依赖关系在构造时由容器一次性设定,组件在被创建之后处于相对不变的稳定状态,无需担心上层代码在调用过程中执行set方法对组件依赖关系进行非法改变,特别对于Singleton模式的组件而言,比较重要;

    (4)由于组件之间的依赖关系仅在构造函数中表达,只有组件的创建者需要关心组件内部的依赖关系,对调用者而言,组件的依赖关系处于黑盒之中;

    (5)通过构造子注入,可以在构造函数中决定依赖关系的注入顺序,对于一个大量依赖外部服务的组件而言,依赖关系的花的顺序可能非常重要。

    以构造注入为主,辅之以设值注入,可以达到最好的依赖注入的效果,不过对于基于Spring Framework开发的应用而言,设值注入使用更加广泛。

原创粉丝点击