`

IOC和DI(控制反转和依赖注入)通俗解析

阅读更多

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容器来创建并注入它所需要的资源了。
        这么小小的一个改变其实是编程思想的一个大进步,这样就有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

分享到:
评论
1 楼 hgg923 2017-10-17  
通俗易懂,看一遍就把这么多年的雾水解清,赞

相关推荐

    c# 依赖注入 控制反转

    ### C# 依赖注入 控制反转 #### 一、IoC(控制反转)简介 IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行...

    IOC控制反转&DI依赖注入

    在本项目中,"IOC技术思想和DI依赖注入"的实现可能包括以下几个方面: 1. 创建一个Spring配置文件,定义bean及其依赖关系。 2. 使用注解(如@Service、@Autowired)来标注bean和它们的依赖。 3. 编写业务逻辑类,...

    springIOC控制反转 依赖注入实例

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它改变了传统Java应用程序中对象的创建和管理方式。在传统的程序设计中,我们通常手动创建对象并管理它们之间的依赖关系,而在Spring中,这些...

    什么是Ioc和DI

    ### 什么是控制反转(IoC)与依赖注入(DI) #### 控制反转(IoC) 控制反转(Inversion of Control,简称IoC)是软件工程领域的一个设计模式,主要用于简化对象之间的依赖关系管理。在传统的面向对象编程中,对象间的...

    spring 控制反转和依赖注入.docx

    Spring 控制反转和依赖注入基础知识详解 Spring 框架是 Java 企业级开发的轻量级开发框架,于 2003 年创建,主要用于解决企业级开发的复杂性。其主要优势在于分层架构,允许在不同层级中使用一个组件(其他框架)...

    Spring 控制反转 依赖注入

    **Spring 框架中的控制反转 (IoC) 和...总之,Spring的控制反转和依赖注入机制是其核心特性,它们提高了代码的可测试性、降低了耦合度,并使应用程序更加灵活。理解并熟练运用这些概念,对提升开发效率和质量至关重要。

    Spring框架控制反转IOC和依赖注入DI详解

    本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。 Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring...

    【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 视图依赖注入代码示例 ).zip

    【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 ) https://hanshuliang.blog.csdn.net/article/details/120404805 博客源码快照

    【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 布局依赖注入代码示例 ).zip

    【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 ) https://hanshuliang.blog.csdn.net/article/details/120402953 博客源码快照

    php中Ioc(控制反转)和Di(依赖注入)

    PHP中的控制反转(IoC)与依赖注入(DI)是面向对象编程中非常重要的设计模式,它们是为了解决传统编程中类与类之间过于紧密耦合的问题而设计的。在PHP中实现这些设计模式可以帮助开发者提高代码的可维护性和可扩展...

    spring dom4j 解析 依赖DI注入 ioc 反转 反射原理

    在IT行业中,Spring框架是Java开发中的核心工具,它提供了许多功能,如依赖注入(DI)、面向切面编程(AOP)以及IoC(控制反转)。在这个话题中,我们将深入探讨Spring框架如何利用DOM4J解析XML配置文件,依赖注入...

    Spring——IOC(控制反转)与DI(依赖注入).docx

    Spring框架中的IOC(控制反转)和DI(依赖注入)是两种关键的设计模式,它们极大地提升了软件的可维护性和可扩展性。控制反转是一种设计思想,它改变了传统的对象创建方式,将对象的创建和管理权从应用程序自身转移...

    基于框架的Web开发-IoC(控制反转)和DI(依赖注入)入门.doc

    【控制反转(IoC)与依赖注入(DI)】是现代Web开发中,尤其是Spring框架中的核心概念。IoC和DI的主要目标是降低组件之间的耦合性,提高代码的灵活性和可维护性。 传统Java开发中,对象通常自行管理它们的依赖关系...

    控制反转(IoC)与依赖注入(DI)1

    【控制反转(IoC)与依赖注入(DI)详解】 控制反转(Inversion of Control,简称IoC)是面向对象编程领域的一种设计原则,旨在降低软件组件间的耦合度。在传统的程序设计中,对象A如果依赖于对象B,那么对象A在...

    我的Pro Spring 学习笔记 之二 控制反转(IoC)和依赖注入(DI), Spring初步

    在本文中,我们将深入探讨...总之,控制反转和依赖注入是Spring框架的关键特性,它们帮助开发者编写更加灵活、可维护和可测试的代码。通过实践和理解这些概念,你将能够更高效地利用Spring来构建复杂的Java应用程序。

    IoC 依赖注入 技术总结

    使用形式化方法对 IoC 依赖注入技术进行描述和分析,可以更加精确、完整地描述 IoC 依赖注入技术的机制。IoC 框架的设计是实现 IoC 依赖注入技术的重要组件,需要完成以下几个基本的功能。IoC 框架的设计可以分为...

    Spring Ioc 注解 依赖注入

    其中,IoC和依赖注入(Dependency Injection, DI)是Spring框架最核心的部分之一。 #### 二、IoC容器概述 在传统的Java应用程序中,对象的创建和管理通常由程序员来完成。这种方式会导致代码之间存在高度耦合,难以...

    Spring_01_入门篇_依赖注入(控制反转)_ANN

    Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),也称为控制反转(Inversion of Control,简称IoC)。 **依赖注入 (DI) 和 控制反转 (IoC)** 依赖注入是Spring的核心设计原则之一。它是一种设计...

    PHP控制反转(IOC)和依赖注入(DI)

    总的来说,PHP中的控制反转和依赖注入提高了代码的解耦度,使得各组件之间相互独立,更容易进行单元测试和维护。通过构造器注入和工厂模式注入,我们可以灵活地管理和替换依赖,从而实现更高效、可扩展的代码设计。...

    自己实现的Spring反转控制和依赖注入

    Spring框架是Java开发中广泛应用的一个开源框架,以其优秀的反转控制(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)理念为核心,极大地简化了企业级应用的开发工作。下面将详细介绍这两个...

Global site tag (gtag.js) - Google Analytics