zoukankan      html  css  js  c++  java
  • 依赖注入和控制反转

    依赖注入和控制反转

     

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


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

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

            下面就来简要的回答一下上述问题,把这些问题搞明白了,IoC/DI也就明白了。
    (1)参与者都有谁:

            一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。
            又要名词解释一下,某个对象指的就是任意的、普通的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类中。
     

            用图例来说明一下,先看没有IoC/DI的时候,常规的A类使用C类的示意图,如图7所示:



                                          图7  常规A使用C示意图

    当有了IoC/DI的容器后,A类不再主动去创建C了,如图8所示:



                                         图8  A类不再主动创建C


    而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中,如图9所示:


                                                   图9  有IoC/DI容器后程序结构示意图


    (9)依赖注入和控制反转是同一概念吗?


            根据上面的讲述,应该能看出来,依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。


    (10)小结一下:

            其实IoC/DI对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入它所需要的资源了。
            这么小小的一个改变其实是编程思想的一个大进步,这样就有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/omg24/p/4223215.html
Copyright © 2011-2022 走看看