`
陈亮宇
  • 浏览: 11376 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

对IOC/DI的理解

阅读更多

对IOC和DI的理解

首先说一下什么是IOC和DI,IOC是Inversion of Control(控制反转)的简写,DI是Dependency Injection(依赖注入)的简写,martinfowler对IOC的解释为:“Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels.”
我想对这一概念进行一个个人的阐述,以方便我的理解。控制反转,从字面意思来看,就是控制权由被动变主动又变为被动,或被动变主动又变为被动。从这个角度来说,IOC就变得非常容易理解了。
举个例子:你的主管要求你做一件事情,这个时候就存在这么几个过程,

   1. 主管命令你做事情(这个时候主动权在主管,你是被动的)
   2. 你接到命令做事情(这个时候主题是你,你是主动的,控制权在你手里)
   3. 你完成事情(这个时候主题依然是你,控制权在你手里)
   4. 报告主管做完事情(主动权又叫交到主管手里了)

上面的整个过程就完成了一次IOC,从上面可以看出,IOC的基本思想是控制权的转换过程。
举个代码的例子:
假如有Class A,Class B,在A内部会初始化一个B,调用B的一个方法DoMethod

public Class B
{
    public void DoMethod()
    {
        /// do somthing;
    }
}
public Class A
{
    public void Excute()
    {
        B b = new B();
        b.DoMethod();
    }
}
假如在Main函数中如下执行:
A a = new A();
a.Excute();
从这两行代码来看,事实上也存在一个IOC的过程,a--->b--->a,理解的关键点就在在A的内部调用Excute的时候,方法b.DoMethod的执行。

理解了IOC,我们再看一下DI,从上面A调用B我们可以看出,在初始化一个A的实例时,也必须实例化一个B,也就是说如果没有B或者B出了问题,A就无法实例化,这就产生了一种依赖,就是A依赖B,这种依赖从设计的角度来说就是耦合,显然它是无法满足高内聚低耦合的要求的。这个时候就需要解耦,当然解耦有很多种方法,而DI就是其中一种。不管任何一种解耦方法,都不是说使A和B完全没有关系,而是把这种关系的实现变得隐晦,不那么直接,但是又很容易实现,而且易于扩展,不像上面的代码那样,直接new一个B出来。那为什么我们总是把IOC和DI联系到一起呢?是因为DI的基本思想就是IOC,而体现IOC 思想的方法还有另外一个,那就是Service Locator,这个方法好像涉及到的很少。

DI,依赖注入,从字面意思就可以看出,依赖是通过外接注入的方式来实现的。这就实现了解耦,而DI的方式通常有三种,

   1. 构造器注入
   2. 属性设置器注入
   3. 接口注入(我感觉接口注入是同时存在于上两种注入方式的,而不应该独立出来)


以上的阐述只是为了先让我们能对IOC和DI有一个感性的理解,那么IOC他真正解决的问题是什么呢?我们讲了那么多主动被动的问题,那我们是从什么视角来看待这个问题的呢?所谓为什么你是主动,而我不是主动呢?这就需要一个参照物,那这个参照物是什么呢?就是容器,在容器中来体现主动和被动。“用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转",这是通常对 IOC的一个解释。从容器的角度来看主动和被动,和由容器来控制程序之间的关系,应该是相通的,是一个意思。到这里我们就应该基本明白了,IOC要解决的就是程序之间调用的一个问题,它应该是一个思想层面的东西,是一个中心,就像一支乐队的指挥,而程序就是乐器,通过指挥来协调各种乐器,来演奏出美好的音乐来。

分享到:
评论

相关推荐

    IOC(DI)与AOP概念的理解

    IOC(DI)与AOP概念的理解

    关于spring的AOP ,IOC,DI的理解

    帮助初学者理解spring框架,有助于提高代码能力java.sql.SQLException: Duplicate entry '2' for key 'PRIMARY' Query: insert into transaction values(?,?,?,?,?) Parameters: [2, 6212999999999, 转出, 6000000, ...

    深入理解DIP、IoC、DI以及IoC容器

    其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC、DI以及Ioc容器等概念。通过本文我们将一起学习这些概念,并理清他们之间微妙的关系。对于大部分小菜来说,当听到大牛们高谈DIP、IoC、DI以及...

    由浅入深理解 IOC 和 DI.pdf

    对扩展开放,对修改封闭。 修改一处代码可能会引起其他地方的 bug ,最好的方式就是新增业务模块/类代替原来的业务 模块/类,使出现 bug 的几率变小。 必须满足此原则的代码才能算作好的可维护的代码

    理解php依赖注入和控制反转

    IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。 2、依赖:谁...

    di_ioc_c#.zip

    依赖注入和IoC乍一看似乎很复杂,但是它们很容易学习和理解。 在本文中,我们将通过在C#中重构一个非常简单的代码示例来说明依赖注入和IoC容器。

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

    IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。在没有IOC的程序中,我们使用面向对象编程,对象的创建于对象间的依赖完全硬编码在程序中,对象的...

    IOC之深入理解SpringIoC

    IoC全称为InversionofControl,翻译为“控制反转”,它还有一个别名为DI(DependencyInjection),即依赖注入。如何理解“控制反转”好呢?理解好它的关键在于我们需要回答如下四个问题:谁控制谁控制什么为何是反转...

    手写IOC项目,学习理解Spring IOC原理

    我们都知道,Spring框架的IOC是基于Java的反射机制实现,实现IOC,...IOC和DI是Spring里面最核心的东西,,资源中会写出这两个模块。资源内容包括Java反射机制的实践,使用反射机制实现IOC(包括依赖注入和对象创建)。

    10-IoC配置-依赖注入概念(DI)

    我相信很多朋友学习IOC概念的时候,查找了很多资料结果还是一头雾水,感觉高深难懂或者一知半解,而我这篇博客就是以通俗易懂的话语,用故事的方式,讲解IOC(控制反转)和DI(依赖注入)的概念,让大家不再晕,不再觉得...

    spring杂谈 作者zhang KaiTao

    1.4 我对IoC/DI的理解 1.5 SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结 1.6 »Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了) 1.7 Spring开闭原则的表现-BeanPostProcessor...

    CH02-IOC依赖注入.pptx

    理解什么是IoC和DI。 理解构造注入 理解不同数据类型的注入方法 掌握p命名空间注入 Bean自动装配

    DI 设计模式.docx

    拜读过Martin Fowler大师的关于IOC容器和DI模式的大作,深感受益匪浅,恰逢正在开发的项目使用了这种技术,因此也想班门弄斧,谈一下自己对IOC容器以及依赖注入的一点理解。 仅凭自己对Martin Fowler大师的大作一点...

    Spring IOC的快速入门案例

    Spring IOC的快速入门案例 >下载Spring的开发包 ...>理解IOC控制反转和DI依赖注入 >编写Spring核心配置文件 >在程序中读取Spring配置文件,通过Spring框架获得Bean,完成相应操作 Spring 4.x的目录结构  

    AngularJS学习第二篇 AngularJS依赖注入

    这里使用了容器B(是指用来实现 IOC/DI 功能的一个框架程序)。 A需要访问C B获取C然后返回给A IOC inversion of control 控制反转:站在容器角度。B控制A,由B反向的向A注入C。即容器控制应用程序,由容器反向的向...

    简单谈谈Spring Ioc原理解析

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring...

    博客中SpringOIC、DI案列文章工程代码

    该资源为本人博客文章“什么是SpringIOC?如何理解SpringIOC?”和“解析Spring DI 依赖注入的5种方式”中SpringOIC、DI演示案列文章工程代码,可下载学习!

    jsp编程技术复习题

    IOC(Inverse of Control控制反转):从字面上理解就是控制反转了,将对在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建...

Global site tag (gtag.js) - Google Analytics