`
kong_bai
  • 浏览: 136446 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

什么叫IOC

阅读更多
IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。


下面我们以几个例子来说明什么是IoC


假设我们要设计一个Girl和一个Boy类,其中Girl有kiss方法,即Girl想要Kiss一个Boy。那么,我们的问题是,Girl如何能够认识这个Boy?


在我们中国,常见的MM与GG的认识方式有以下几种
1 青梅竹马; 2 亲友介绍; 3 父母包办
那么哪一种才是最好呢?


青梅竹马:Girl从小就知道自己的Boy。


public class Girl { 
void kiss(){ 
Boy boy = new Boy(); 
} 
} 



然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果我们的Girl想要换一个怎么办?(严重不支持Girl经常更换Boy,#_#)


亲友介绍:由中间人负责提供Boy来见面


public class Girl { 
void kiss(){ 
Boy boy = BoyFactory.createBoy(); 
} 
} 



亲友介绍,固然是好。如果不满意,尽管另外换一个好了。但是,亲友BoyFactory经常是以Singleton的形式出现,不然就是,存在于Globals,无处不在,无处不能。实在是太繁琐了一点,不够灵活。我为什么一定要这个亲友掺和进来呢?为什么一定要付给她介绍费呢?万一最好的朋友爱上了我的男朋友呢?


父母包办:一切交给父母,自己不用费吹灰之力,只需要等着Kiss就好了。


public class Girl { 
void kiss(Boy boy){ 
// kiss boy 
boy.kiss(); 
} 
} 


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
public class Girl implements Servicable { 
private Kissable kissable; 
public Girl() { 
kissable = new Boy(); 
} 
public void kissYourKissable() { 
kissable.kiss(); 
} 
} 


Girl自己建立自己的Boy,很难更换,很难共享给别人,只能单独使用,并负责完全的生命周期。


IOC type 1,先看代码:代码


public class Girl implements Servicable { 

Kissable kissable; 

public void service(ServiceManager mgr) { 
kissable = (Kissable) mgr.lookup(“kissable”); 
} 

public void kissYourKissable() { 
kissable.kiss(); 
} 

} 



这种情况出现于Avalon Framework。一个组件实现了Servicable接口,就必须实现service方法,并传入一个ServiceManager。其中会含有需要的其它组件。只需要在service方法中初始化需要的Boy。


另外,J2EE中从Context取得对象也属于type 1。它依赖于配置文件。


IOC type 2:


public class Girl { 

private Kissable kissable; 

public void setKissable(Kissable kissable) { 
this.kissable = kissable; 
} 

public void kissYourKissable() { 
kissable.kiss(); 
} 

} 



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

IOC type 3:


public class Girl { 

private Kissable kissable; 

public Girl(Kissable kissable) { 
this.kissable = kissable; 
} 

public void kissYourKissable() { 
kissable.kiss(); 
} 

} 



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

PicoContainer container = new DefaultPicoContainer(); 
container.registerComponentImplementation(Boy.class); 
container.registerComponentImplementation(Girl.class); 
Girl girl = (Girl) container.getComponentInstance(Girl.class); 
girl.kissYourKissable();
分享到:
评论

相关推荐

    Android应用开发中控制反转IoC设计模式使用教程

    首先我们来吹吹牛,什么叫IoC,控制反转(Inversion of Control,英文缩写为IoC),什么意思呢? 就是你一个类里面需要用到很多个成员变量,传统的写法,你要用这些成员变量,那么你就new 出来用呗~~ IoC的原则是:...

    springioc和spring aop

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

    Spring的IoC实现案例

    创建Priter类和pater类,分别代表打印机和纸张,然后利用Spring的IoC对打印机进行组装,分别实现A4纸打印和b5纸打印。

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

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

    Springboot入门——初学者对Spring Ioc技术的理解与运用,包含Bean生命周期

    初学者可能不理解什么叫控制反转,那么我们来进一步描述一下Ioc。 Ioc是一种通过描述来生成或获取对象的技术,这里的对象当然是指java对象。 在Java中我们更多的是通过new关键字来创建对象,在Spring中,则是通过...

    Spring IoC中的基础知识

    IoC称为控制反转又叫DI(依赖注入)。 2.Spring Spring的定义:是一个IoC容器  分为: spring core  spring beans: 组件工厂BeanFactory  spring context: 环境,装配  spring expression 3.Spring 组件的...

    C#墨攻IOC

    原文叫看《墨攻》理解IOC概念 2006年多部贺岁大片以让人应接不暇的频率纷至沓来,其中张之亮的《墨攻》算是比较出彩的一部,讲述了战国时期墨家人革离帮助梁 国反抗赵国侵略的个人英雄主义故事,恢宏壮阔,浑雄凝重...

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

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

    java面试题

    Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的连接。 heap和stack有什么区别? 答:...

    xmljava系统源码-Myioc:这是一个简单的IoC容器实现

    正好IoC容器的实现大量地使用了IoC,反射,设计模式,所以打算自己写一个简单的IoC容器来练习,网上查了一下,发现github上有一个叫 的开源项目,简化了Spring的IoC容器和AOP,API名字都是仿照Spring,所以临摹了一下...

    tiny-spring-practice:实践tiny-spring,手写Spring两大核心功能:IOC和AOP

    然后发现了多年前的一个精简版的Spring学习项目,叫,作者对spring核心的IOC和AOP进行了临摹实现,也很细心的对实现步骤进行了拆分。我看完了tiny-spring收获许多,自己也参考该项目进行了模仿与实践,从我学习的...

    Android应用orm和ioc开发框架

    源码KJFrameForAndroid,KJFrameForAndroid 又叫KJLibrary,是一个帮助快速开发的框架。使用KJFrameForAndroid,你可以轻松完成http请求、网络图片加载、数据库数据保存或读取。是一个android的orm和ioc框架。同时...

    SSM相关面试题(包括Spring,SpringMVC,Mybaits在内的50道面试题)

    什么是IOC? IOC,Inversion of Control,控制反转,指将对象的控制权转移给Spring框架,由 Spring 来负责控制对象的生命周期(比如创建、销毁)和对象间的依赖关系。 最直观的表达就是,以前创建对象的时机和主动...

    SIDL:Spring Ioc AOP-洛根

    SIDL(SpringIoc AOP-洛根) 抽象的 Ioc和AOP是Spring框架的核心。 该项目使用SpringBoot框架进行hotswapping ... 我的英文名字叫Logan。 还有其他请随时与我联系。 :megaphone: 微信:xmg102104 :envelope: 电子邮件:

    tiny-spring:一个很小的IoC容器指的是Spring

    一个很小的IoC容器是指Spring。 关于 tiny-spring是为了学习Spring的而开发的,可以认为是一个Spring的精简版。Spring的代码很多,层次复杂,阅读起来费劲。我尝试从使用功能的角度出发,参考Spring的实现,一步一步...

    不多spring文件

    "反向控制"的意思其实很简单,就是开发人员通常说的"实现必须依赖抽象",或者叫"面向接口编程"。当然这样说起来,可能会不好理解,下面将主要通过示例来说明这个概念。这个示例主要说明的是如何通过IoC来实现具体的...

    SF2依赖注入组件PHP类.zip

    <?... namespace Symfony\Component\...而采用依赖注入的方式,创建被调用者的工作不再由调用者来完成,因此叫控制反转,创建被调用者的实例的工作由IOC容器来完成,然后注入调用者,因此也称为依赖注入。

    嵌入式系统/ARM技术中的一种DOTNET平台组件配置工具的应用

    反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在。...但为什么叫DOTNET(。NET)呢?在计算机行业DOT是Distributed

    一种DOTNET平台组件配置工具的应用

    反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在。...但为什么叫DOTNET(。NET)呢?在计算机行业DOT是Distributed

Global site tag (gtag.js) - Google Analytics