介绍 IOC
作者:冰云 icecloud(AT)sina.com
BLOG: http://icecloud.51.net
时间:2004.02.15
|
一、什么是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 {
|
然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果我们的Girl想要换一个怎么办?(笔者严重不支持Girl经常更换Boy)
亲友介绍:由中间人负责提供Boy来见面
|
亲友介绍,固然是好。如果不满意,尽管另外换一个好了。但是,亲友BoyFactory经常是以Singleton的形式出现,不然就是,存在于Globals,无处不在,无处不能。实在是太繁琐了一点,不够灵活。我为什么一定要这个亲友掺和进来呢?为什么一定要付给她介绍费呢?万一最好的朋友爱上了我的男朋友呢?
父母包办:一切交给父母,自己不用费吹灰之力,只需要等着Kiss就好了。
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() { public void kissYourKissable() { }
|
Girl自己建立自己的Boy,很难更换,很难共享给别人,只能单独使用,并负责完全的生命周期。
IOC type 1,先看代码:
public class Girl implements Servicable { Kissable kissable; public void service(ServiceManager mgr) { public void kissYourKissable() { }
|
这种情况出现于Avalon Framework。一个组件实现了Servicable接口,就必须实现service方法,并传入一个ServiceManager。其中会含有需要的其它组件。只需要在service方法中初始化需要的Boy。
另外,J2EE中从Context取得对象也属于type 1。
它依赖于配置文件
<container> <component name=“girl" class=“Girl" />
|
IOC type 2:
public class Girl { private Kissable kissable; public void setKissable(Kissable kissable) { public void kissYourKissable() { }
|
Type 2出现于Spring Framework,是通过JavaBean的set方法来将需要的Boy传递给Girl。它必须依赖于配置文件。
<beans>
|
IOC type 3
public class Girl { private Kissable kissable; public Girl(Kissable kissable) { public void kissYourKissable() { }
|
这就是PicoContainer的组件 。通过构造函数传递Boy给Girl。
PicoContainer container = new DefaultPicoContainer();
|
关于PicoContainer,作者后续文章会详细介绍。
作者语:
Well,以上的这些理论部分有些已经有了新的定义了。过些天我会再写一些文章具体说明。比如,原来的三种type结构现在已经重新定义为依赖注射的许多层次。
IoC很年轻,还在发展。伴随着IOC的发展,AOP,COP,SOP等等都在不断的发展。作为程序员,随时关注着新的思想的发展是一件很轻松愉快的事情。有没有人愿意和我一起探讨学习共同进步呀!
参考资料
1 本文主要插图及文字来源于ThoughtWorks公司的Jon Tirsén 与 Aslak Hellesøy(PicoContainer的两位开发者),2003年在Java Polis的演讲PPT。有删改。
http://www.picocontainer.org/presentations/JavaPolis2003.ppt
http://www.picocontainer.org/presentations/JavaPolis2003.pdf
2 DIP, Robert C Martin, Bob大叔的优秀论文
http://www.objectmentor.com/resources/articles/dip.pdf
3 Dependency Injection 依赖注射,Matrin Fowler对DIP的扩展
http://www.martinfowler.com/articles/injection.html
4 IOC框架
PicoContainer 优秀的IOC框架
Avalon
Spring Framework
http://www.springframework.org/
HiveMind
http://jakarta.apache.org/commons/hivemind
5 中文资料
程序匠:国内研究Pico的先驱
http://douleimi.vicp.net/space/start
Jdon:板桥也在研究
http://www.jdon.com/design.htm
Spring Framework中文论坛
http://xglw.51.net/5team/springframework/index.php
Avalon 中文资料
http://www.huihoo.org/apache/avalon/introduction.html
ERPROAD
http://www.erproad.org/index.asp?vt=bycat&cat_id=37
Open Heart
发表评论
-
nginx代理IIS轻松实现支持JSP,PHP,ASP平台
2012-05-12 21:16 1626通过使用高效代理服务器nginx代理IIS轻松实现支持JSP, ... -
OpenSessionInViewFilter的使用
2011-06-22 11:34 735一、作用 Spring为我们解决Hibernate的Sess ... -
tomcat服务器使用url rewrite1
2011-05-19 18:25 1481让tomcat服务器使用url rewrite1. 第 ... -
CountDownLatch闭锁详解
2011-05-09 10:29 1321闭锁(Latch) 闭锁(Latch):一种同步方法,可以延 ... -
memcache/memcached/memcachedb 配置、安装
2011-05-05 15:44 1206memcache/memcached/memcachedb ... -
jquery.treeview使用
2011-03-25 18:31 1535这几天项目中要用到树型结构,正好项目中用到了JQuery,所以 ... -
集群的可扩展性及其分布式体系结构
2011-03-17 14:54 1107常见的平衡算法 一般 ... -
strust2防止重复提交
2011-03-15 10:05 1130在请求表单中添加<s:token></s:t ... -
源码中没有任何错误目录中还存在红叉
2011-02-26 17:04 774查看.classpath文件。修改正确配置!lib与src -
长连接与短连接
2011-01-04 15:44 1118长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送 ... -
带“+”号的参数值通过url传递,后台取不到正确值
2010-11-29 15:19 2485带“+”号的参数值通过url传递,后台取不到正确值 问题是这样 ... -
JCom的使用
2010-11-08 11:15 2778JCom可以支持打印,支持生成word,生成Excel,并且可 ... -
利用java操作Excel文件
2010-10-28 16:45 753利用java操作Excel文件 很久以来都想 ... -
XSL将XML转换成HTML文件 js方法
2010-10-22 14:34 3020JavaScript解决方案XSL是如何将XML转换成HTML ... -
web.xml详解
2010-10-22 09:18 675部署描述符实际上是一个XML文件,包含了很多描述servlet ... -
jsvalidation表单验证框架使用相关问题
2010-10-05 18:57 11351、如果验证框架没有起作用,就先把验证框架的js文件、x ... -
java中调用c(c++)写的dll 文件的实现及步骤
2010-09-08 10:08 1823JNI使用技巧点滴本文为 ... -
我的站点
2010-01-09 10:43 0www.51sj.com 我要设计 www.52sj.co ... -
Oracle创建删除用户、角色、表空间、导入导出数据库命令行方式总结
2009-12-18 21:31 2337说明: 在创建数据库时输入的密码,是修改系统默认的密码,以sy ... -
jdbc连接各种数据库
2009-12-18 21:08 817一、jsp连接Oracle8/8i/9i数据库(用thin模式 ...
相关推荐
Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...
IOC(Inversion of Control,控制反转)模式是一种软件设计原则,它在面向对象编程中用于解耦组件之间的依赖关系。C#中实现IOC的一种常见方式是通过依赖注入(Dependency Injection,DI)。在这个“IOC模式 c#经典...
在IT行业中,依赖注入(IOC,Inversion of Control)是一种设计模式,它使得应用程序的组件之间解耦,提高了代码的可测试性和可维护性。在这个“自己实现ioc实例demo”中,我们将探讨如何通过XPath解析XML文件来实现...
标题中的“雷赛IOC0640.rar”指的是雷赛智能公司的一款名为IOC0640的工业控制产品,该产品通常用于自动化控制系统中,提供高效、稳定的输入/输出(I/O)管理。这个压缩包可能包含了关于该产品的详细资料和技术文档。...
2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解 含义 @Component 标注Bean @Autowired 标注需要被注入的对象 @Configuration 标注为配置类 @ComponentScan ...
**Spring Ioc 实现原理详解** Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由...
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
根据给定的文件信息,以下是对雷泰IOC-0640控制卡用户手册V1.3中的关键知识点的详细解读: ### 关于本手册 本手册是针对雷泰IOC-0640控制卡的详细用户指南,旨在帮助用户了解如何使用这款设备。手册分为七个章节,...
在本文中,我们将深入探讨如何使用Spring的Inversion of Control(IoC)容器来实现一个具体的案例:控制打印机(Printer)类与不同类型的纸张(Paper)类的交互。Spring的IoC允许我们解耦组件,使代码更加灵活且易于...
在Spring框架中,依赖注入(Inversion of Control, IoC)和面向切面编程(Aspect Oriented Programming, AOP)是两大核心特性。本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 #...
在现代软件开发中,依赖注入(IOC,Inversion of Control)和面向切面编程(AOP,Aspect-Oriented Programming)是两种非常重要的设计模式,它们有助于提高代码的可测试性、可维护性和模块化程度。这个名为...
"图片转IOC图标工具"正是一款专为开发者设计的实用工具,旨在帮助他们将普通的图片转换为适用于iOS平台的.IOC图标格式。 .IOC(Image Asset Catalog)是苹果iOS开发中的图像资源格式,主要用于存储不同尺寸和状态的...
在IT行业中,Spring框架是Java开发中的重要组成部分,特别是其依赖注入(Dependency Injection,简称DI)功能,也称为控制反转(Inversion of Control,IoC)。这个“一个简单的模仿spring的ioc实现”项目旨在帮助...
"雷赛IOC0640函数库.rar" 是一个压缩包,其中包含了针对雷赛(LeiSee)IOC0640设备的编程接口。这个函数库主要用于与该设备进行通信和控制,支持C++、C#以及VB(Visual Basic)三种编程语言,通过动态链接库(DLL)...
PCI并口卡 PCI转打印并口DB25接口扩展卡 IOC835芯片驱动 功能描述: 在具备PCI插槽的电脑上扩展出1个DB25并口 规格说明: 符合PCIRev2.1协议 传输率最大可达1.5 Mbytes/sec 1个DB25并口接头 符合标准的带16byte接收...
### 什么是控制反转(IoC)与依赖注入(DI) #### 控制反转(IoC) 控制反转(Inversion of Control,简称IoC)是软件工程领域的一个设计模式,主要用于简化对象之间的依赖关系管理。在传统的面向对象编程中,对象间的...
Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...
我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理和源码。 详细内容见博文: 【SSH进阶之路】一步步重构容器实现Spring的IoC——从一个...
JavaEE Spring IoC(Inversion of Control,控制反转)是企业级应用开发的重要技术,它极大地简化了Java应用程序的构建和维护。Spring框架的核心特性就是IoC,它通过管理对象的生命周期和对象间的依赖关系,使得...
"IoC 依赖注入 技术总结" IoC 依赖注入技术是软件设计中的一种重要技术,旨在解决软件系统中的耦合问题。该技术的核心思想是将被调用构件实例化,并注入到调用构件之中,以实现软件系统的高内聚、低耦合。IoC 依赖...