﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-砖头-文章分类-介绍IoC</title><link>http://www.blogjava.net/yaozhuan/category/8684.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 03:07:24 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 03:07:24 GMT</pubDate><ttl>60</ttl><item><title>介绍IoC（转自CSDN，作者冰云） </title><link>http://www.blogjava.net/yaozhuan/articles/36271.html</link><dc:creator>砖头</dc:creator><author>砖头</author><pubDate>Mon, 20 Mar 2006 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/yaozhuan/articles/36271.html</guid><description><![CDATA[
		<font size="2">
				<strong>一、什么是IoC<br /></strong>　　IoC就是Inversion of Control，控制反转。在Java开发中，IoC意味着将你设计好的类交给系统去控制，而不是在你的类内部控制。这称为控制反转。<br />　　下面我们以几个例子来说明什么是IoC。<br />　　假设我们要设计一个Girl和一个Boy类，其中Girl有kiss方法，即Girl想要Kiss一个Boy。那么，我们的问题是，Girl如何能够认识这个Boy？<br />　　在我们中国，常见的MM与GG的认识方式有以下几种：<br />　　1：青梅竹马；2：亲友介绍；3：父母包办。<br />　　那么哪一种才是最好呢？<br /><br />　　<strong>青梅竹马</strong>：Girl从小就知道自己的Boy。<br />代码：<br /></font>
		<table class="Code">
				<tbody>
						<tr>
								<td>
										<font size="2">public class Girl {<br />    void kiss(){<br />        Boy boy = new Boy();<br />    }<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">　　然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果我们的Girl想要换一个怎么办？（笔者严重不支持Girl经常更换Boy）<br /><br />　　<strong>亲友介绍</strong>：由中间人负责提供Boy来见面。 <br />代码：<br /></font>
		<table class="Code">
				<tbody>
						<tr>
								<td>
										<font size="2">public class Girl {<br />    void kiss(){<br />        Boy boy = BoyFactory.createBoy();<br />    }<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">　　亲友介绍，固然是好。如果不满意，尽管另外换一个好了。但是，亲友BoyFactory经常是以Singleton的形式出现，不然就是，存在于Globals，无处不在，无处不能。实在是太繁琐了一点，不够灵活。我为什么一定要这个亲友掺和进来呢？为什么一定要付给她介绍费呢？万一最好的朋友爱上了我的男朋友呢？<br /><br />　　<strong>父母包办</strong>：一切交给父母，自己不用费吹灰之力，只需要等着Kiss就好了。<br />代码：<br /></font>
		<table class="Code">
				<tbody>
						<tr>
								<td>
										<font size="2">public class Girl {<br />    void kiss(Boy boy){<br />        // kiss boy<br />        boy.kiss();<br />    }<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">　　Well，这是对Girl最好的方法，只要想办法贿赂了Girl的父母，并把Boy交给他。那么我们就可以轻松的和Girl来Kiss了。看来几千年传统的父母之命还真是有用哦。至少Boy和Girl不用自己瞎忙乎了。<br /><br />　　这就是IOC，将对象的创建和获取提取到外部。由外部容器提供需要的组件。<br />我们知道好莱坞原则：“Do not call us, we will call you.” 意思就是，You, girlie, do not call the boy. We will feed you a boy。<br />　　我们还应该知道依赖倒转原则即 Dependence Inversion Princinple，DIP。<br /><br />　　Eric Gamma说，要面向抽象编程。面向接口编程是面向对象的核心。<br />　　组件应该分为两部分，即：<br />　　·Service，所提供功能的声明；<br />　　·Implementation，Service的实现。<br />　　好处是：多实现可以任意切换，防止“everything depends on everything”问题。即具体依赖于具体。<br />　　所以，我们的Boy应该是实现Kissable接口。这样一旦Girl不想kiss可恶的Boy的话，还可以kiss可爱的kitten和慈祥的grandmother。<br /><br /><strong>二、IOC的Type</strong><br />　　IoC的Type指的是Girl得到Boy的几种不同方式。我们逐一来说明。 <br />　　·IoC Type 0：不用IOC<br />代码：<br /></font>
		<table class="Code">
				<tbody>
						<tr>
								<td>
										<font size="2">public class Girl implements Servicable {<br />    private Kissable kissable;<br />    public Girl() {<br />        kissable = new Boy();<br />    }<br />    public void kissYourKissable() {<br />        kissable.kiss();<br />    }<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">　　Girl自己建立自己的Boy，很难更换，很难共享给别人，只能单独使用，并负责完全的生命周期。 <br /><br />　　·IOC Type 1：<br />先看代码：<br /></font>
		<table class="Code">
				<tbody>
						<tr>
								<td>
										<font size="2">public class Girl implements Servicable { <br />    Kissable kissable; <br />    public void service(ServiceManager mgr) { <br />        kissable = (Kissable) mgr.lookup("kissable"); <br />    }<br />    public void kissYourKissable() { <br />        kissable.kiss(); <br />    }<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">　　这种情况出现于Avalon Framework。一个组件实现了Servicable接口，就必须实现service方法，并传入一个ServiceManager。其中会含有需要的其它组件。只需要在service方法中初始化需要的Boy。<br />　　另外，J2EE中从Context取得对象也属于Type 1。它依赖于配置文件。<br /><br />　　·IoC Type 2：<br />代码：<br /></font>
		<table class="Code">
				<tbody>
						<tr>
								<td>
										<font size="2">public class Girl {<br />    private Kissable kissable;<br />    public void setKissable(Kissable kissable) {<br />        this.kissable = kissable;<br />    }<br />    public void kissYourKissable() {<br />        kissable.kiss();<br />    }<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">　　Type 2出现于Spring Framework，是通过JavaBean的set方法来将需要的Boy传递给Girl。它必须依赖于配置文件。<br /><br />　　·IoC Type 3：<br />代码：<br /></font>
		<table class="Code">
				<tbody>
						<tr>
								<td>
										<font size="2">public class Girl {<br />    private Kissable kissable;<br />    public Girl(Kissable kissable) {<br />        this.kissable = kissable;<br />    }<br />    public void kissYourKissable() {<br />        kissable.kiss();<br />    }<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">　　这就是PicoContainer的组件。通过构造函数传递Boy给Girl。<br />代码： <br /></font>
		<table class="Code">
				<tbody>
						<tr>
								<td>
										<font size="2">PicoContainer container = new DefaultPicoContainer(); <br />container.registerComponentImplementation(Boy.class); <br />container.registerComponentImplementation(Girl.class); <br />Girl girl = (Girl) container.getComponentInstance(Girl.class); <br />girl.kissYourKissable();</font>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<!-- InstanceEndEditable -->
<img src ="http://www.blogjava.net/yaozhuan/aggbug/36271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaozhuan/" target="_blank">砖头</a> 2006-03-20 12:04 <a href="http://www.blogjava.net/yaozhuan/articles/36271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>