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

    转载地址:https://zhuanlan.zhihu.com/p/95869440

    控制反转
    控制反转(Inversion of Control,简称IoC),是面向对象编程中的一种设计思想,其作用是用来降低代码间的耦合度(低[松]耦合)。其实现IoC主要有两种方法,一种是依赖注入(Denpendency Injection),一种是依赖查找(Denpendency Lookup)。IoC通过依赖注入的方法,解决了代码间高耦合度的问题。

    如何理解控制反转
    在理解控制反转之前,我们不妨先拆分下,把控制反转拆分成“控制”和“反转”。由此,我们可以得出以下三个疑问:
    是谁控制谁?
    控制的是什么?
    反转的是什么?
    要搞懂这些为什么,我们需要寻找一个切入点,那么提出控制反转的目的是什么?我们前面说它的目的是降低代码间的耦合度。
    那什么又是耦合度呢,在一个真实的项目中,势必会存在多个对象,那对象与对象之间势必存在依赖关系,对象间的这种依赖关系越低,就说明对象间的耦合度越低,那代码的可扩展性就越高。在理解了耦合度之后,事情仿佛变得越来越清晰了,我们先梳理下,控制反转的目的是用来降低代码间的耦合度,代码的耦合度跟对象之间依赖有关系,也就是说我们要把对象间的这种依赖关系控制的越低越好。

    在此,我们用例子说明一下,比如说我们现在有两个对象A和B,现在要在A对象中使用B,我们如何去做,是不是要在A对象中new一个B对象啊,也就是说是A对象在控制B对象,那现在我们是不是就明白了,控制指的就是依赖对象的创建。在这个过程中谁是老大,当然是A啦,A主宰着B的创建,所以A说了算。

    控制指的就是,当前应用程序(A对象)主宰着所有资源(B对象)的获取,也就是控制着依赖资源的获取过程!

    至此,我们已经搞懂两个了,还有一个反转。由前面的分析我们知道,是当前对象控制的依赖对象,那么反转,也就是说不是当前对象在控制依赖对象。那由谁控制呢,这就是接下来我们要解释的依赖注入,在此之前我们先总结下我们之前提出的三个为什么。

    谁控制谁:当前应用程序控制依赖资源(对象、数据等);
    控制什么:获取依赖资源的过程;
    反转什么:获取依赖资源的过程被反转了;

    依赖注入(Denpendency Injection,简称DI):
    我们之前分析到,控制被反转了,也就是说获取依赖资源的过程被反转了。之前由应用程序主动获取变成了被动接受。同样在理解依赖注入之前,我们按照上面的方式也来拆分下,即:
    谁依赖谁?
    依赖的是什么?
    谁被注入了?
    注入的是什么?
    刚才我们已经分析到了,应用程序由主动变被动,也就是说应用程序要依赖IoC容器,去帮助它间接的获取依赖对象的资源。然后将依赖对象的资源注入到应用程序中,有了前面的铺垫,我们可以顺理成章的完成上述疑问的答案。
    谁依赖谁:应用程序依赖IoC容器;
    依赖的是什么:被依赖对象的资源;
    谁被注入了:依赖的外部资源;
    注入的是什么:应用程序依赖的资源被注入了;

    总结:
    依赖注入是控制反转实现的一种方式,也就是说控制反转是依赖注入的载体,也就是容器;之前由应用程序来完成对依赖对象的创建,现在全部由IoC容器来完成。它实现的价值就是剥离组件之间的依赖关系,从而实现组件的高内聚性、可扩展性和高可用性。

  • 相关阅读:
    配置了configuration.xml之后提示找不到映射关系
    alibaba maven地址
    Linux通过FTP上传文件到服务器
    JS模拟PHP的sleep
    PHP设置会话(Session)超时过期时间实现登录时间限制[转]
    JavaScript with JSONPath
    用于解析通过JS的escape函数加密过的数据
    IDC、ICP、ISP区别
    zTree通过指定ID找到节点并选中
    运动轨迹[转]
  • 原文地址:https://www.cnblogs.com/zhaobao1830/p/12004954.html
Copyright © 2011-2022 走看看