介绍 IOC

原创 2004年07月11日 14:51:00
一、什么是IOC

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

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


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

CSDN_Dev_Image_2004-2-16115390.gif

在我们中国,常见的MM与GG的认识方式有以下几种

1 青梅竹马; 2 亲友介绍; 3 父母包办

那么哪一种才是最好呢?

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

CSDN_Dev_Image_2004-2-16115392.gif

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


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

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

CSDN_Dev_Image_2004-2-16115394.gif



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


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



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

CSDN_Dev_Image_2004-2-16115396.gif


代码:
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

CSDN_Dev_Image_2004-2-16115398.gif
Eric Gamma说,要面向抽象编程。面向接口编程是面向对象的核心。

组件应该分为两部分,即

Service, 所提供功能的声明

Implementation, Service的实现

好处是:多实现可以任意切换,防止 “everything depends on everything” 问题.即具体依赖于具体。

所以,我们的Boy应该是实现Kissable接口。这样一旦Girl不想kiss可恶的Boy的话,还可以kiss可爱的kitten和慈祥的grandmother。

CSDN_Dev_Image_2004-2-161153910.gif


二、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();

Spring中IOC和AOP的介绍

前言:控制反转(Inversion of Control,英文缩写为IoC); 面向切面编程(Aspect Oriented Programming,英文缩写为AOP)我们是在使用spring框架的...
  • u013412772
  • u013412772
  • 2016年11月28日 22:31
  • 1210

Spring---IOC简介

1、引言 1.1 为什么需要IoC容器 (1)应用程序主动控制对象的实例化及依赖装配 A a = new AImpl(); B b = new BImpl(); a.setB(b); 本质:...
  • hla199106
  • hla199106
  • 2015年08月13日 17:30
  • 692

通俗的介绍Spring的IOC特性和原理

前言: 我才做项目没多久,几个项目都是用的spring框架,先开始其实并不清楚spring有什么好的特性,只知道别人那样写的,我也就依葫芦画瓢的写,后来也是想搞清楚为什么spring框架这么流行,才来...
  • qq_33142257
  • qq_33142257
  • 2016年11月11日 01:30
  • 798

IOC、DI、AOP是什么,为什么使用,怎么用

IOC、DI、AOP是什么,为什么使用,怎么用 Spring中加载配置文件的两种方法,可以加载多个配置文件吗?单例模式、和工厂模式定义 依赖注入的三种方法 1.IOC IOC为控制反转...
  • maidaogo
  • maidaogo
  • 2014年11月25日 09:58
  • 695

简单理解IOC和AOP的原理

IOC,依赖倒置的意思, 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。 所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调...
  • linxijun120903
  • linxijun120903
  • 2017年02月22日 15:55
  • 5808

Spring中IOC与AOP的理解

关于IOC我们知道是Spring中很重要的组合部分,下面就IOC的理解写一点自己的心得: 1.IOC是什么? IOC也称控制反转,其实是和依赖注入的含义是一样的,就是把原先控制代码对象的生产由代码...
  • qq_35347459
  • qq_35347459
  • 2017年04月26日 17:51
  • 600

Spring框架之IOC、AOP详解

spring框架之IOC spring框架之AOP spring框架搭建
  • shuaicihai
  • shuaicihai
  • 2017年01月18日 10:05
  • 662

Spark框架简介

简介了解系统架构是第一件事,那么系统都由什么节点构成提供什么服务呢?框架 从框架图中可以看到 - 整个集群分为 Master 节点和 Worker 节点,相当于 Hadoop 的 Master 和...
  • kimsungho
  • kimsungho
  • 2016年04月17日 23:31
  • 760

对IOC,AOP的理解

(1)  ioc,意思是Inversion of control,(反转控制),控制反转,就是交换控制权的意思。现在一般不使用这个词,一般使用dependency injection(依赖注入)。依赖...
  • melodysky
  • melodysky
  • 2016年08月26日 16:33
  • 3890

简单描述对AOP和IOC的理解

(1)  ioc,意思是Inversion ofcontrol,(反转控制),控制反转,就是交换控制权的意思。现在一般不使用这个词,一般使用dependencyinjection(依赖注入)。依赖注入...
  • lizhibin3944
  • lizhibin3944
  • 2013年07月10日 07:14
  • 1278
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:介绍 IOC
举报原因:
原因补充:

(最多只允许输入30个字)