﻿<?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-thinking-随笔分类-Spring</title><link>http://www.blogjava.net/alinglau36/category/40302.html</link><description>one platform thousands thinking</description><language>zh-cn</language><lastBuildDate>Fri, 03 Dec 2010 11:16:29 GMT</lastBuildDate><pubDate>Fri, 03 Dec 2010 11:16:29 GMT</pubDate><ttl>60</ttl><item><title>IoC 依赖注入、以及在Spring中的实现(转)</title><link>http://www.blogjava.net/alinglau36/archive/2010/12/02/339623.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Thu, 02 Dec 2010 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2010/12/02/339623.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/339623.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2010/12/02/339623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/339623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/339623.html</trackback:ping><description><![CDATA[<p><br />
</p>
<table align="right" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td>                         <br />
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp; 一般的书籍都会从IoC和AOP开始介绍起，这个IoC概念，个人感觉资料里都写得让人看得有些痛苦，所谓IoC，就是
控制反转（Inversion of
Control）的缩写，这个大家都知道，但是个人觉得理解这个概念，最好应该从依赖（dependence）开始讲起，以下观点由此展开：<br />
&nbsp;&nbsp;&nbsp;
所谓依赖，举个例子说明，一个类Person，另一个类Car，如果Person的某个方法比如说drive，需要引用Car，则称Person类依赖于
Car类，延伸到对象，这种依赖关系依然成立，比如说Person类的对象boy依赖于Car类的对象toyota。再讲讲这个drive方法的实现，假
定代码如下：<br />
Public Person{<br />
...<br />
public void drive(){<br />
&nbsp; Car toyota=new Car("TOYOTA");<br />
&nbsp; toyota.挂档;<br />
&nbsp; toyota.踩油门;<br />
&nbsp; toyota.打方向;<br />
}<br />
}<br />
&nbsp;&nbsp;&nbsp; 这其中的依赖关系，就导致了对象boy需要负责对象toyota的创建，甚至是整个生命周期的管理，而这样显然会带来耦合度高，不易维护等缺点，比如说要让这个男孩驾驶一辆Audi，则还需要修改类Person的代码。<br />
&nbsp;&nbsp;&nbsp;
因此在java的设计理论中就提出了一条非常著名的原则，依赖倒转原则（Dependence
Inversion），其核心思想就是要将这种具体类之间的依赖，尽量转换成抽象依赖，也就是说类Person应该依赖于抽象类ICar，而不是具体的类
Car，这里java就大力推荐了抽象和接口的使用，至于抽象和接口之间的区别，任何一本JAVA书籍都有介绍，这里就不再说了。<br />
<br />
&nbsp;&nbsp;&nbsp;
这个依赖倒转原则在设计模式也体现得非常多，比如说工厂模式和构建模式，个人认为控制反转IoC，其实也可以认为是实现这个原则的一种设计模式。控制反
转，其中的控制这个词一直不太理解是什么意思，不过控制反转的另外一种说法也就是依赖注入（dependence
injection），个人觉得更易于理解。还是以上文的boy与toyota为例，其核心就是要将boy依赖的对象toyota注入到boy中去，而无
需boy自己去引用toyota，这个注入的过程，通常是由一个控制程序来完成的，无需对象去关心，举例如下：<br />
Public Person{<br />
private ICar car;<br />
public Person(ICar onecar){<br />
&nbsp; car=onecar;<br />
}<br />
public void drive(){<br />
&nbsp; car.挂档;<br />
&nbsp; car.踩油门;<br />
&nbsp; car.打方向;<br />
}<br />
}<br />
&nbsp;&nbsp;&nbsp; 这个时候，进行注入并且调用的过程，就很简单了，如下：<br />
Toyota toyota=new Toyota();<br />
Person boy=new Person(toyota);<br />
boy.drive();<br />
&nbsp;&nbsp;&nbsp; 注：这里我们假定，Toyota类是ICar接口类的一个具体实现。<br />
&nbsp;&nbsp;&nbsp; 这个例子就演示一个最简单的注入方式的例子，也就是构造子方式注入，通过将依赖对象注入到对象的构造子中来实现。另外还有一种常用的注入方式，就是属性方式注入，意思就是通过将依赖对象注入到对象的属性中来实现，还是以boy和toyota的例子说明，如下：<br />
Public Person{<br />
private ICar car;<br />
public Person(){<br />
}<br />
public void drive(){<br />
&nbsp; car.挂档;<br />
&nbsp; car.踩油门;<br />
&nbsp; car.打方向;<br />
}<br />
public ICar getCar(){<br />
&nbsp; return this.car;<br />
}<br />
public void setCar(ICar onecar){<br />
&nbsp; car=onecar;<br />
}<br />
}<br />
&nbsp;&nbsp;&nbsp; 这个时候，进行注入并且调用的过程，就变成如下所示：<br />
Toyota toyota=new Toyota();<br />
Person boy=new Person();<br />
boy.setCar(toyota);<br />
boy.drive();<br />
&nbsp;&nbsp;&nbsp;
至此依赖注入的概念应该比较清楚了，再来看看在Spring中如何实现IoC的，看看Spring如何作为一个成熟的IoC容器，Spring中其实主要
通过两个概念来实现IoC，首先通过XML配置文件，将对象和依赖对象都配置到某个XML文件中，当然该XML文件需要符合Spring指定的规范，然后
通过架构中的BeanFactroy类，来自动实现上文所述注入过程，还是以boy与toyota为例，如下：<br />
首先，Person类还是一样的，<br />
然后xml配置文件增加点东西-（假定为bean.xml）：<br />
&lt;?xml version="1.0" encoding="GBK"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" <br />
&nbsp;&nbsp;&nbsp; "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp; &lt;bean id="oneCar" class="Toyota"&gt; &lt;!-- Toyota类是ICar的一个实现--&gt;<br />
&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp; &lt;bean id="onePerson" class="Person"&gt; &lt;!--本例以属性方式注入为例 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="car"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="oneCar"&gt;&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;/beans&gt;<br />
最后，调用的过程，就变成如下：<br />
BeanFactory factory=new XmlBeanFactory("bean.xml");<br />
Person boy=(Person )factory.getBean("onePerson");<br />
boy.drive();
<img src ="http://www.blogjava.net/alinglau36/aggbug/339623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2010-12-02 17:07 <a href="http://www.blogjava.net/alinglau36/archive/2010/12/02/339623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>