`
leshy
  • 浏览: 27168 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

控制反转(Inversion of Control)介绍(转)

阅读更多

转自http://java.chinaitlab.com/others/20557.html

一、什么是IOC
  IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。
  
  下面我们以几个例子来说明什么是IoC
  
  假设我们要设计一个Girl和一个Boy类,其中Girl有kiss方法,即Girl想要Kiss一个Boy。那么,我们的问题是,Girl如何能够认识这个Boy?
  

 
  在我们中国,常见的MM与GG的认识方式有以下几种
  
  1 青梅竹马; 2 亲友介绍; 3 父母包办
  
  那么哪一种才是最好呢?
  
  青梅竹马:Girl从小就知道自己的Boy。
    
  
java 代码
  1. public class Girl {    
  2.   void kiss(){    
  3.     Boy boy = new Boy();    
  4.   }    
  5.   }    

    
  然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果我们的Girl想要换一个怎么办?(笔者严重不支持Girl经常更换Boy)
  
  亲友介绍:由中间人负责提供Boy来见面
    
  
java 代码
  1. public class Girl {    
  2.   void kiss(){    
  3.     Boy boy = BoyFactory.createBoy();      
  4.   }    
  5.   }    

    
  亲友介绍,固然是好。如果不满意,尽管另外换一个好了。但是,亲友BoyFactory经常是以Singleton的形式出现,不然就是,存在于Globals,无处不在,无处不能。实在是太繁琐了一点,不够灵活。我为什么一定要这个亲友掺和进来呢?为什么一定要付给她介绍费呢?万一最好的朋友爱上了我的男朋友呢?
  
  父母包办:一切交给父母,自己不用费吹灰之力,只需要等着Kiss就好了。
    
  
java 代码
  1. public class Girl {    
  2.   void kiss(Boy boy){    
  3.     // kiss boy    
  4.    boy.kiss();    
  5.   }    
  6.   }    

    
  Well,这是对Girl最好的方法,只要想办法贿赂了Girl的父母,并把Boy交给他。那么我们就可以轻松的和Girl来Kiss了。看来几千年传统的父母之命还真是有用哦。至少Boy和Girl不用自己瞎忙乎了。
  
  这就是IOC,将对象的创建和获取提取到外部。由外部容器提供需要的组件。
  
  我们知道好莱坞原则:“Do not call us, we will call you.” 意思就是,You, girlie, do not call the boy. We will feed you a boy。
  
  我们还应该知道依赖倒转原则即 Dependence Inversion Princinple,DIP
    
  Eric Gamma说,要面向抽象编程。面向接口编程是面向对象的核心。
  
  组件应该分为两部分,即
  
  Service, 所提供功能的声明
  
  Implementation, Service的实现
  
  好处是:多实现可以任意切换,防止 “everything depends on everything” 问题.即具体依赖于具体。
  
  所以,我们的Boy应该是实现Kissable接口。这样一旦Girl不想kiss可恶的Boy的话,还可以kiss可爱的kitten和慈祥的grandmother。
  
  二、IOC的type
  IoC的Type指的是Girl得到Boy的几种不同方式。我们逐一来说明。
  
  IOC type 0:不用IOC
  
 
java 代码
  1. public class Girl implements Servicable {    
  2.      
  3.   private Kissable kissable;    
  4.      
  5.   public Girl() {    
  6.     kissable = new Boy();    
  7.   }    
  8.      
  9.   public void kissYourKissable() {    
  10.     kissable.kiss();    
  11.   }    
  12.      
  13.   }    

    
  Girl自己建立自己的Boy,很难更换,很难共享给别人,只能单独使用,并负责完全的生命周期。
  
  IOC type 1,先看代码:
  
  
java 代码
  1.  public class Girl implements Servicable {    
  2.      
  3.   Kissable kissable;    
  4.      
  5.   public void service(ServiceManager mgr) {    
  6.     kissable = (Kissable) mgr.lookup(“kissable”);    
  7.   }    
  8.      
  9.   public void kissYourKissable() {    
  10.     kissable.kiss();    
  11.   }    
  12.      
  13.   }   

 
  
  这种情况出现于Avalon Framework。一个组件实现了Servicable接口,就必须实现service方法,并传入一个ServiceManager。其中会含有需要的其它组件。只需要在service方法中初始化需要的Boy。
  
  另外,J2EE中从Context取得对象也属于type 1。
  
  它依赖于配置文件
  
  代码:
  
    …
  
  IOC type 2:
  
  
java 代码
  1. public class Girl {    
  2.      
  3.   private Kissable kissable;    
  4.      
  5.   public void setKissable(Kissable kissable) {    
  6.     this.kissable = kissable;    
  7.   }    
  8.      
  9.   public void kissYourKissable() {    
  10.     kissable.kiss();    
  11.   }    
  12.      
  13.   }    


    
  Type 2出现于Spring Framework,是通过JavaBean的set方法来将需要的Boy传递给Girl。它必须依赖于配置文件。
  
  代码:
  
  IOC type 3:
  
  

java 代码
  1. public class Girl {    
  2.      
  3.   private Kissable kissable;    
  4.      
  5.   public Girl(Kissable kissable) {    
  6.     this.kissable = kissable;    
  7.   }    
  8.   public void kissYourKissable() {    
  9.     kissable.kiss();    
  10.   }    
  11. }    

  
  这就是PicoContainer的组件 。通过构造函数传递Boy给Girl
  代码:
  
  

java 代码
  1. PicoContainer container = new DefaultPicoContainer();    
  2.   container.registerComponentImplementation(Boy.class);    
  3.   container.registerComponentImplementation(Girl.class);    
  4.   Girl girl = (Girl) container.getComponentInstance(Girl.class);    
  5.   girl.kissYourKissable();  
分享到:
评论

相关推荐

    Inversion of Control Containers and the Dependency Injection pattern.docx

    这些容器背后的核心技术通常被统称为“控制反转”(Inversion of Control, IoC)。本文将深入探讨这一模式的工作原理,并特别关注依赖注入(Dependency Injection, DI)这一更为具体的形式。此外,我们还将对比依赖注入...

    控制反轉(Inversion of Control)

    **控制反转(Inversion of Control, IOC)**是软件设计中的一个重要概念,它在近年来的系统开发模式中占据了显著地位,特别是在面向对象编程领域。控制反转的核心思想是将原本由程序内部控制的流程或者对象创建过程...

    IOC(inversion of control)

    IOC,即Inversion of Control,中文常被翻译为“控制反转”,是面向对象编程领域中的一个设计模式,尤其在Spring框架中广泛应用。控制反转是一种设计原则,它将对象的创建和组装过程从代码中分离出来,交给容器来...

    控制反转_百度百科1

    控制反转_Inversion of Control(IoC) 控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。控制反转一般分为两种类型,...

    Event-Based Programming without Inversion of Control.pdf

    ### 事件驱动编程无须控制反转 #### 一、引言与背景 随着分布式系统及移动环境的发展,以及多核处理器技术的普及,并发编程变得不可或缺。一方面,分布式与移动环境天然涉及并发处理;另一方面,多核处理器能够...

    体验控制反转的理念及Spring介绍技术文档

    Spring之所以能够迅速崛起并获得广泛认可,关键在于其独特的设计理念——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI)。这些设计理念不仅简化了开发流程,还提高了软件的...

    Spring.NET控制反转(IoC)和面向切面(AOP)的容器框架

    Spring.NET 控制反转(Inversion of Control,英文缩写为IoC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象(控制权)发生转变,由最初的类本身来管理依赖对象转变为IoC框架来管理...

    c# 依赖注入 控制反转

    IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行时控制流的方向发生了“反转”。传统的程序设计中,应用程序...

    spring 控制反转的模拟程序

    Spring框架是Java开发中最常用的轻量级框架之一,它的核心特性是依赖注入(Dependency Injection,简称DI),也常被称为控制反转(Inversion of Control,简称IoC)。控制反转是一种设计模式,它改变了传统应用程序...

    SpringSecutiry实现认证授权功能,整合SpringBoot

    它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制...

    Spring Security、Spring Social 、Spring Security OAuth

    它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制...

    控制反转和容器(二)

    控制反转(Inversion of Control,简称IoC)是一种设计模式,它在软件工程中被广泛应用于构建可扩展、松耦合的系统。这个概念的核心是将对象的创建和依赖关系的管理从应用程序代码中剥离出来,转交给一个外部的实体...

    控制反转应用,模拟Hibernate

    在编程领域,控制反转(Inversion of Control,简称IoC)是一种设计模式,它将对象的创建和管理责任从应用程序转移到框架或容器中。在Java编程中,IoC通过依赖注入(Dependency Injection,DI)来实现,使得组件之间...

    04-IoC简介-控制翻转概念(IoC)

    控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找...

    Android中的“控制反转”(下)

    在Android开发中,“控制反转”(Inversion of Control,简称IOC)是一种设计模式,它将对象的创建和管理权从代码本身转移到一个外部容器,如依赖注入框架。本篇文章主要探讨的是Android中如何实现和应用控制反转,...

    Spring IOC 控制反转

    它通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect Oriented Programming, AOP)等特性实现了对应用程序的解耦,并通过IOC(Inversion of Control)控制反转来简化配置和管理。 #### 二、Spring ...

    spring技术--IOC控制反转课件.ppt

    其中,IOC(Inversion of Control,控制反转)是Spring的核心特性之一,它改变了传统对象创建和管理的方式,实现了依赖注入(Dependency Injection)。本课件主要介绍了Spring中的IOC原理、特点以及如何使用。 ### ...

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

    它的核心特性是依赖注入(Dependency Injection,简称DI),也被称为控制反转(Inversion of Control,简称IOC)。这个特性使得开发者可以更专注于业务逻辑,而不需要过多地关注对象的创建和管理。 **依赖注入(DI...

    helloIoc.zip spring ioc控制反转简单测试代码

    Spring框架的核心特性之一就是依赖注入(Dependency Injection,简称DI),它通过控制反转(Inversion of Control,简称IOC)实现。这个"helloIoc.zip"压缩包包含的是一组用于演示Spring IOC基本概念和使用的测试...

    asp.net mvc4控制反转

    在ASP.NET MVC4框架中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它改变了传统程序设计中对象之间的依赖关系,使得应用程序的组件可以更加灵活、可扩展。控制反转的核心理念是将对象的创建和管理...

Global site tag (gtag.js) - Google Analytics