`
陈亮宇
  • 浏览: 12260 次
  • 性别: 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要解决的就是程序之间调用的一个问题,它应该是一个思想层面的东西,是一个中心,就像一支乐队的指挥,而程序就是乐器,通过指挥来协调各种乐器,来演奏出美好的音乐来。

分享到:
评论

相关推荐

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

    Spring的核心特性包括AOP(面向切面编程)和IOC(控制反转),以及依赖注入(DI)。以下是对这些概念的详细解释: **面向切面编程(AOP)** AOP是一种编程范式,它允许开发者将关注点从主业务逻辑中分离出来,例如...

    Ioc, DI demo

    在“IocPerformance-master”这个项目中,开发者可能对不同IoC容器(如Autofac、Unity、StructureMap等)进行了性能比较,或者测试了在大规模应用中DI的效率。这样的测试对于理解在实际应用中选择哪种DI框架具有重要...

    IOC(DI)与AOP概念的理解

    "IOC(DI)与AOP概念的理解" IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是软件设计中两个重要的概念。控制反转的意思是依赖关系的获取方式被反转了。所谓依赖,从程序的角度看,...

    Spring中IOC/AOP的说明和例子

    在Spring框架中,IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)是两个核心的...因此,理解并熟练应用Spring的IOC和AOP对于提升Java应用程序的质量和可维护性至关重要。

    手写IOC,DI,servlet

    总的来说,这个项目提供了一个从零开始学习和理解IOC、DI和Servlet应用的机会,对于Java Web开发者来说,深入理解这些基础概念对于提升技能和解决实际问题非常有帮助。通过这种方式,开发者能够更好地掌握Web应用的...

    由浅入深理解 IOC 和 DI.pdf

    在软件开发中,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是两种重要的设计模式,它们对于实现灵活、可维护的代码具有重要作用。这些概念遵循了开闭原则(OCP,Open-Closed ...

    ioc_di (1)

    标题 "ioc_di (1)" 暗示了我们即将探讨的话题是有关于IoC(Inversion of Control)和DI(Dependency Injection),这是Spring框架中的核心概念。这些概念在软件工程中至关重要,因为它们有助于实现松耦合和可维护性...

    day38 03-Spring的IOC和DI的区别

    标题中的"Spring的IOC和DI的区别"涉及到Spring框架的核心特性,即控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)。这两个概念是理解Spring框架工作方式的关键。 首先,控制...

    轻量型框架资源手册1

    轻量型框架的特点主要是 Ioc 或称 Dependency Injection (DI),通过 Ioc 模式的使用,所有的 POJO 可以实现最大化的松耦合,具体详情可了解 Ioc 模式/DI。Ioc/DI 是所有轻量框架的一个共同特点,不同的只是具体 Ioc/...

    spring-demo02-IOC-DI案例.zip

    总之,"spring-demo02-IOC-DI案例"是一个很好的实践平台,帮助开发者深入理解并掌握Spring框架的核心特性,提高代码的可维护性和可扩展性。通过研究和实践这个案例,你将能够更好地应用这些知识到实际的项目开发中。

    spring核心IOC以及DI

    【Spring核心IOC以及DI】是Spring框架中的关键概念,它们是Spring实现控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)的基石。这两个概念是Spring框架的核心,使得应用程序的...

    Spring的Bean管理;IoC, DI

    首先,让我们深入理解IoC和DI的概念。控制反转(IoC)是一种设计原则,它将对象的创建和管理职责从应用代码中分离出来,转交给外部容器(在这种情况下是Spring容器)。这样,应用不再负责对象的创建和维护,而是由...

    spring入门学习-2、IOC、DI知识.pdf

    通过了解Spring框架中的IOC和DI概念,我们可以更好地理解Spring是如何帮助我们管理对象生命周期以及依赖关系的。无论是在项目开发初期还是后期维护阶段,合理利用这些特性都能极大地提高工作效率并减少潜在的错误。

    SpringIOC,DI+dynamic proxy 实现盗版AOP

    通过对Spring的IOC、DI和动态代理的理解,我们可以自行构建一个简化的AOP系统,实现对特定方法的增强,从而达到类似Spring AOP的效果。这种方法对于学习Spring AOP的工作原理非常有帮助,同时也为在没有Spring AOP...

    Java开发学习(二)----IOC、DI入门案例.doc

    【Java开发学习(二)——IOC、DI入门案例】 在Java开发中,Spring框架的核心特性之一就是Inversion of Control(IoC,控制反转)和Dependency Injection(DI,依赖注入)。这两个概念是紧密相关的,理解它们有助于...

    最新的ioc代码例子

    在Java开发中,IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和管理交给了外部容器,使得代码...这将有助于提升开发者对Java应用程序设计模式的理解,以及如何利用Spring框架来优化代码结构。

    02-01-07-用30个类高仿真提炼纯手写Spring框架V2.0之IOC与DI1

    【Spring 框架的IOC与DI理解】 Spring框架的核心特性之一是控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)。这两个概念在软件设计中起到了至关重要的作用,它们帮助开发者...

    干净的spring初始化工程,包含ioc,di,datasource,但是不包含aop

    它提供了许多关键特性,如依赖注入(Dependency Injection,简称DI)、面向切面编程(Aspect-Oriented Programming,简称AOP)以及控制反转(Inversion of Control,简称IOC)。在这个“干净的spring初始化工程”中...

    自己动手做框架(27)——配置IOC框架.rar

    架构师需要理解如何设计和组织系统的组件,以及如何利用IOC/DI等设计原则来提高系统的可维护性和扩展性。 在压缩包中的`jar`文件可能是用于演示或测试的示例应用,`ppt`可能包含关于IOC理论和实践的演示文稿,`文档...

Global site tag (gtag.js) - Google Analytics