zoukankan      html  css  js  c++  java
  • 如何理解IoC/DI

    IoC:Inversion of Control,控制反转
    DI:Dependency Injection,依赖注入

    要理解上面两个概念,就必须搞清楚如下的问题:

    参与者都有谁?
    依赖:谁依赖于谁?为什么需要依赖?
    注入:谁注入于谁?到底注入什么?
    控制反转:谁控制谁?控制什么?为什么叫反转(有反转就应该有正转了)?
    依赖注入和控制反转是同一概念吗?

    下面就来简要地回答一下上述问题,把这些问题搞明白了,也就明白IoC/DI了。
    (1)参与者都有谁:一般有三方参与者,一个是某个对象;另一个是IoC/DI容器(譬如Spring);还有一个是某个对象的外部资源。
    Tips:某个对象指的是任意的、普通的Java对象;IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;
    对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称为资源,譬如,对象需要的其它对象,或者是对象需要的文件资源等。

    (2)谁依赖于谁:当然是某个对象依赖于IoC/DI的容器
    (3)为什么需要依赖:对象需要IoC/DI的容器来提供对象需要的外部资源
    (4)谁注入谁:很明显是IoC/DI的容器把某个对象需要的资源注入此对象
    (5)到底注入什么:就是注入某个对象所需要的外部资源
    (6)谁控制谁:当然是IoC/DI的容器来控制对象了
    (7)控制什么:主要是控制对象实例的创建
    (8)为何叫反转:反转是相对于正向而言的,那么什么算是正向的呢?
    考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?
    一般会使用组合,直接去创建C的对象,也就是说,在A类中主动去获取需要的外部资源C,这种情况被称为正向的。
    那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向地注入到A类中
    主动去取是正向,被动接收就反向,从正向改为反向,就称为反转

    (9)依赖注入和控制反转是同一概念吗?
    依赖注入和控制反转是对同一事情的不同角度的描述。

    DI/IoC都是以对象为主体来描述构架、对象、资源之间的关系,

    DI强调的是框架的作用:对象依赖框架,框架服务对象(对象什么也不做,等着框架主动伺候);
    IoC强调的是对象获取资源的方式,是主动创建还是被动接收;

    依赖注入是强调某个对象获取需要的资源的方式;
    控制反转强调的是指某个对象在获取所需资源是主动还是被动;

    从某个方面讲,就是它们描述的角度不同。
    依赖注入是从应用程序的角度去描述,可以把依赖注入描述得完整点:应用程序依赖容器创建并注入它所需要的外部资源;
    控制反转是从容器的角度去描述,容器接管一切,描述的完整点就是:容器控制应用程序,由容器向应用程序注入其所需要的外部资源。

    因为以前是应用程序主动获取所需的资源,需要什么主动拿什么,
    现在的方式和以前相反
    框架接管一切,应用程序所需资源及吃喝拉撒框架负责,什么都由框架来做,这种方式与以前相反,
    这个变化就称为反转或者逆袭,都是与以前相比较的。

    IoC/DI的进步是编程思想上“主从换位”的变化。应用程序原来是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,
    应用程序就变成被动的了,被动地等待IoC/DI容器来创建并注入它所需要的资源。

    IoC/DI的目标是代码复用、解耦。当然,程序的体系结构也变得非常灵活。

    《研磨设计模式》

  • 相关阅读:
    队列

    有序数组
    集合:一条规则决定性能
    基础数据结构:数组
    空间复杂度
    插入排序
    重新认识Javascript的一些误区总结
    Knockout: 使用knockout validation插件进行校验, 给未通过校验的输入框添加红色边框突出显示.
    Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.
  • 原文地址:https://www.cnblogs.com/softidea/p/3863359.html
Copyright © 2011-2022 走看看