ioc(Inversion of Control)控制反转和DI

ioc意味着将你设计好的交给容器控制,而不是传统在你的对象中直接控制
    谁控制了谁:传统的javaSE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而ioc是有专门一个容器来创建这些对象,即由ioc容器来控制对象的创建;当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
    哪些方面反转:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接或去依赖对象,也就是正转;而反转则是有容器帮忙创建及注入依赖对象。因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
    所谓的ioc,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系
那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。

    Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

设计模式

    IoC可以认为是一种全新的设计模式,但是理论和时间成熟相对较晚,并没有包含在GoF中。
    Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:AInterface a = new AInterfaceImp(); 这样一来,耦合关系就产生了

classA
{
    AInterface a;

    A(){}

    AMethod()//一个方法
    {
        a = new AInterfaceImp();
    }
}

Class A与AInterfaceImp就是依赖关系,如果想使用AInterface的另外一个实现就需要更改代码了。当然我们可以建立一个Factory来根据条件生成想要的AInterface的具体实现,即:

InterfaceImplFactory
{
   AInterface create(Object condition)
   {
      if(condition == condA)
      {
          return new AInterfaceImpA();
      }
      else if(condition == condB)
      {
          return new AInterfaceImpB();
      }
      else
      {
          return new AInterfaceImp();
      }
    }
}

 DI -- Dependency Injection,依赖注入

  即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中. 依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现.

    理解DI的关键是 "谁依赖谁,为什么需要依赖, 谁注入谁,注入了什么",下面来深入分析一下:

    谁依赖于谁 :  应用程序依赖于IoC/DI容器

    为什么需要依赖 : 因为反转后,应用程序所依赖都资源都在IoC/DI容器中

    谁注入谁 : IoC/DI容器注入应用程序

    注入了什么: 注入了应用程序需要的外部资源,比如:依赖关系

控制反转和依赖注入之间是同一个概念吗?

    它们不是同一个概念,但是它们是同一个概念的不同角度的描述。

    控制反转(IoC)从 IoC容器的角度来说

    依赖注入(DI) 从应用程序的角度来说      

ioc与di的区别

    DI就是斧头,ioc就是树,最好的办法就是用斧头砍树。
    当然可以不用斧头,所以ioc不一定需要DI,也可以有别的方案。
    当然斧头不必砍树,斧头能做的事情好多,不过一般用来砍树。

时间: 2024-10-10 17:21:13

ioc(Inversion of Control)控制反转和DI的相关文章

IoC(Inversion of Control)控制反转和 DI(Dependency Injection)依赖注入

首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好.qq号.电话号.ip号.iq号---,想办法认识她们,投其所好送其所要,然后嘿嘿--这个过程是复杂深奥的,我们必须自己设计和面对每个环节.传统的程序开发也是如此,在

【Java_Spring】控制反转IoC(Inversion of Control)

1. IOC的概念 控制反转IoC(Inversion of Control)是一种设计思想,而DI(依赖注入)是实现IoC的一种方法.在没有使用IOC的程序中,对象间的依赖关系是靠硬编码的方式实现的.引入IOC后对象的创建由程序自己控制的,控制反转即将对象的创建交给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了. IoC是Spring框架的核心内容,在IOC容器中一切对象皆为Bean组件.IOC容器通过读取XML配置文件中的Bean信息,产生每个Bean实例.使用多种方式完美的实现

谈谈php里的IOC控制反转,DI依赖注入

理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现,表现为:在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属

谈谈php里的IOC控制反转,DI依赖注入(转)

转自:http://www.cnblogs.com/qq120848369/p/6129483.html 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现

Ioc(Inversion of Control)

Ioc(Inversion of Control)即控制反转.在java开发中,Ioc意味着将设计好的类交给系统去控制,而不是在自己的内部控制.这称为控制反转. Ioc方式 在struts2中,通过Ioc方式将Servlet对象注入到Action中,具体实现是由一组接口决定的,要采用Ioc方式就必须在Action中实现以下接口: 1)ApplicationAware:以Map类型向Action注入保存在ServletContext中的Attribute集合 2)SessionAware:以Map

spring IOC控制反转和DI依赖注入

spring framework 的doc地址:https://docs.spring.io/spring/docs/current/spring-framework-reference/ spring framework 作为一个优秀的开源框架,其高扩展和高可用性毋庸置疑.这篇文章记录spring framework的控制反转. 1.什么叫控制反转:在系统开发中我们要创建一个实例常见的做法就是new 一个对象(当然也还有其他创建实例的方法,eg 反射,工厂模式),这种通过程序员手动创建实例的行

IOC控制反转与DI依赖注入

控制反转(Ioc设计模式): 通过反射(通过一个字符串)来创建对象,把具体的文件名写在配置文件(XML)中,当需要修改使用的对象就可以通过修改配置文件来修改对象. 控制反转就是把对象的控制权转移,转移给Ioc容器(spring).相当于是创建了一个工厂,不过可以通过Ioc容器修改配置文件XML来修改创建什么对象. Assembly类:表示一个程序集. Configuration Manager类:提供对客户端应用程序配置文件的访问. ConfigurationManager.AppSetting

Spring中的Ioc控制反转与DI注入

Spring的控制反转 1.spring的介绍 spring是一款很受欢迎的java开源框架,核心全程围绕着BeanFactory展开,构成如下图. 2.IOC控制反转 2.1定义:把对象创建交给spring管理,不用new的方法,也不用工厂模式 2.2原理:1.xml配置文件,2.dom4j解析xml,3.工厂设计模式,4.反射 2.3使用:1.配置文件方式,2.注解方式 3.IOC注入bean管理  3.1.1 xml配置方式 1.就是xml配置文件中的spring创建对象的方式,也就是be

工厂方法模式与IoC/DI控制反转和依赖注入

IoC——Inversion of Control  控制反转 DI——Dependency Injection   依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依赖于谁?为什么需要依赖? 注入:谁注入于谁?到底注入什么? 控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了)? 依赖注入和控制反转是同一概念吗? 下面就来简要的回答一下上述问题,把这些问题搞明白了,IoC/DI也就明白了.(1)参与者都有谁: 一般有三方参与者,一个是某个对象:一个