﻿<?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-Crazy For You-随笔分类-Java Web</title><link>http://www.blogjava.net/yejiansuo/category/46650.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 18 Oct 2010 15:32:16 GMT</lastBuildDate><pubDate>Mon, 18 Oct 2010 15:32:16 GMT</pubDate><ttl>60</ttl><item><title>Spring 之BeanFactory</title><link>http://www.blogjava.net/yejiansuo/archive/2010/10/18/335442.html</link><dc:creator>叶建锁</dc:creator><author>叶建锁</author><pubDate>Mon, 18 Oct 2010 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/yejiansuo/archive/2010/10/18/335442.html</guid><description><![CDATA[<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-size: 8pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="z-index: 1; position: absolute; margin-top: 100px; width: 170px; height: 85px; margin-left: 60px; left: 0px"><span style="font-family: Arial"></span></span><span style="font-family: Arial"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 8pt"><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">是</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Spring</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的&#8220;心脏&#8221;。它就是</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Spring&nbsp;IoC</span></span></span><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">容器的真面目。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Spring</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">使用</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">来<span style="color: red"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实例化、配置和管理</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span></span></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">。但是，在大多数情况我们并不直接使用</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，而是使用</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">ApplicationContext</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">。它也是</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span></span></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-size: 8pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">的一个实<br />
<br />
现，但是它添加了一系列&#8220;框架&#8221;的特征，比如：<span style="color: red">国际化支持、资源访问、事件传播</span>等。<br />
</span></span><br />
<br />
<br />
</span></span></span></span></span></span></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p><span style="font-family: Arial"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 8pt"><span style="font-size: 8pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/yejiansuo/3.jpg" width="371" height="107" /></span></span></span></span></span></span></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p><span style="font-family: Arial"></span></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p><span style="font-family: Arial"></span></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p><span style="font-family: Arial"></span></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: Arial"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 8pt"><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">其实是一个接口－</span><span style="font-family: 'Times New Roman'; color: red; font-size: 10.5pt; mso-spacerun: 'yes'">org.springframework.beans.factory.BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">，它可以配置和管理几乎所有的</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Java</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">类。当然，具体的工作是由实现</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">接口<br />
<br />
的实现类完成。我们最常用的</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实现是</span><span style="font-family: 'Times New Roman'; color: red; font-size: 10.5pt; mso-spacerun: 'yes'">org.springframework.beans.factory.xml.XmlBeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">。它从</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">XML</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">文件中读取</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的定义信息。当</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">被创建<br />
<br />
时，</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Spring</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">验证每个</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的配置。当然，要等</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">创建之后才能设置</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的属性。单例</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">(Singleton)Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">在启动时就会被</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实例化，其它的</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">在请求时创建。根<br />
<br />
据</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Java</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">文档（</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Javadocs</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）介绍，&#8220;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">定义的持久化方式没有任何的限制：</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">LDAP</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">、</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">RDBMS</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">、</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">XML</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">、属性文件，等等&#8221;。现在</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Spring</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">已提供了</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">XML</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">文件和<br />
<br />
属性文件的实现。无疑，</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">XML</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">文件是定义</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span></span></span><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的最佳方式。<br />
<br />
<br />
</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></span></span></span></span></span></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: Arial"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 8pt"><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">是初始化</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span></span></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><span style="font-size: 10pt"><span style="font-size: 10pt">和调用它们生命周期方法的&#8220;吃苦耐劳者&#8221;。</span></span><span style="color: red"><span style="font-family: Arial"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 8pt"><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">注意，</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">只能管理单例（</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Singleton</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的生命周期。它不能管理原型</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">(prototype,</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">非单<br />
<br />
例</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">)Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的生命周期。这是因为原型</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实例被创建之后便被传给了客户端</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">,</span></span></span><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">容器失去了对它们的引用。<br />
<br />
<br />
</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: Arial"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 8pt"><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: 'Times New Roman'; font-size: 16pt; font-weight: bold; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 16pt; font-weight: bold; mso-spacerun: 'yes'">管理</span><span style="font-family: 'Times New Roman'; font-size: 16pt; font-weight: bold; mso-spacerun: 'yes'">Bean</span></span></span><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: '宋体'; font-size: 16pt; font-weight: bold; mso-spacerun: 'yes'">（组件）的生命周期<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 16pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></span></span></span></span></span></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: Arial"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 8pt"><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下图描述了</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的生命周期。它是由</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">IoC</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">容器控制。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">IoC</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">容器定义</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">操作的规则，即</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的定义（</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanDefinition</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">的定义包含了</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">在创建</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实<br />
<br />
例时需要的所有信息。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">BeanFactory</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">首先通过构造函数创建一个</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实例，之后它会执行</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实例的一系列之前初始化动作，初始化结束</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">将进入准备就绪（</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">ready</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）<br />
<br />
状态，这时应用程序就可以获取这些</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实例了。最后，当你销毁单例（</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Singleton</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">）</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">时，它会调用相应的销毁方法，结束</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Bean</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">实例的生命周期。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></span></span></span></span></span></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p><span style="font-family: Arial"></span></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p><span style="font-family: Arial"></span></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: Arial"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 8pt"><span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/yejiansuo/4.jpg" /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></span></span></span></span></span></span></p>
<img src ="http://www.blogjava.net/yejiansuo/aggbug/335442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yejiansuo/" target="_blank">叶建锁</a> 2010-10-18 13:26 <a href="http://www.blogjava.net/yejiansuo/archive/2010/10/18/335442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是控制反转/依赖注入？</title><link>http://www.blogjava.net/yejiansuo/archive/2010/10/18/335440.html</link><dc:creator>叶建锁</dc:creator><author>叶建锁</author><pubDate>Mon, 18 Oct 2010 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/yejiansuo/archive/2010/10/18/335440.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;控制反转（IoC=Inversion of Control）IoC，用白话来讲，就是由容器控制程序之间的（依赖）关系，而非传统实现中，由程序代码直接操控。这也就是所谓&#8220;控制反转&#8221;的概念所在：（依赖）控制权由应用代码中转到了外部容器，控制权的转移，是所谓反转。&nbsp;&nbsp;&nbsp;&nbsp;IoC也称为好...&nbsp;&nbsp;<a href='http://www.blogjava.net/yejiansuo/archive/2010/10/18/335440.html'>阅读全文</a><img src ="http://www.blogjava.net/yejiansuo/aggbug/335440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yejiansuo/" target="_blank">叶建锁</a> 2010-10-18 12:53 <a href="http://www.blogjava.net/yejiansuo/archive/2010/10/18/335440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP处理日志 </title><link>http://www.blogjava.net/yejiansuo/archive/2010/10/17/335347.html</link><dc:creator>叶建锁</dc:creator><author>叶建锁</author><pubDate>Sun, 17 Oct 2010 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/yejiansuo/archive/2010/10/17/335347.html</guid><description><![CDATA[<span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AOP正在成为软件开发的下一个圣杯。使用AOP，你可以将处理aspect的代码注入主程序， 通常主程序的主要目的并不在于处理这些aspect。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AOP可以防止代码混乱。 为了理解AOP 如何做到这点，考虑一下记日志的工作。日志本身不太可能是你开发的主程序的主要任务。 如果能将&#8220;不可见的&#8221;、通用的日志代码注入主程序中，那该多好啊。AOP可以帮助你做到。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring framework是很有前途的AOP技术。作为一种非侵略性的，轻型的AOP framework，你无需使用预编译器或其他的元标签，便可以在Java程序中使用它。这意味着开发团队里只需 一人要对付AOP framework，其他人还是象往常一样编程。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AOP是很多直觉难以理解的术语的根源。幸运的是，你只要理解三个概念，就可以编写AOP模块。这三个概念是：advice，pointcut和advisor。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; advice是你想向别的程序内部不同的地方注入的代码。pointcut定义了需要注入advice的位置，通常是某个特定的类的一个public方法。advisor是pointcut和advice的装配器，是将advice注入主程序中预定义位置的代码。 </p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 既然我们知道了需要使用advisor向主要代码中注入&#8220;不可见的&#8221;advice，让我们实现一个Spring AOP的例子。 在这个例子中，我们将实现一个before advice，这意味着advice的代码在被调用的public方法开始前被执行。 以下是这个before advice的实现代码： </p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.company.springaop.test;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Method;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.aop.MethodBeforeAdvice;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img id="Codehighlighter1_185_568_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_568_Open_Text.style.display='none'; Codehighlighter1_185_568_Closed_Image.style.display='inline'; Codehighlighter1_185_568_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_185_568_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_185_568_Closed_Text.style.display='none'; Codehighlighter1_185_568_Open_Image.style.display='inline'; Codehighlighter1_185_568_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestBeforeAdvice&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;MethodBeforeAdvice&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_185_568_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_185_568_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这里还有after，Exception，around等Advice</span><span style="color: #008000"><br />
<img id="Codehighlighter1_223_369_Open_Image" onclick="this.style.display='none'; Codehighlighter1_223_369_Open_Text.style.display='none'; Codehighlighter1_223_369_Closed_Image.style.display='inline'; Codehighlighter1_223_369_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_223_369_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_223_369_Closed_Text.style.display='none'; Codehighlighter1_223_369_Open_Image.style.display='inline'; Codehighlighter1_223_369_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_223_369_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_223_369_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*before&nbsp;是在方法执行之前执行advice的内容，around是在方法执行之前和之后都得到了执行<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />*Exception是抛出异常的时候，可以使用aop的方法来统一处理业务的异常。<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&#215;在编程的时候，可以由专门的人处理业务的异常，其它人还是一样的编程，不用考虑业务类异常的处理。<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;before(Method&nbsp;m,&nbsp;Object[]&nbsp;args,&nbsp;Object&nbsp;target)&nbsp;<br />
<img id="Codehighlighter1_453_565_Open_Image" onclick="this.style.display='none'; Codehighlighter1_453_565_Open_Text.style.display='none'; Codehighlighter1_453_565_Closed_Image.style.display='inline'; Codehighlighter1_453_565_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_453_565_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_453_565_Closed_Text.style.display='none'; Codehighlighter1_453_565_Open_Image.style.display='inline'; Codehighlighter1_453_565_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Throwable&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_453_565_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_453_565_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这里能用反射？</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;world!&nbsp;(by&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getName()&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>接口MethodBeforeAdvice只有一个方法before需要实现，它定义了advice的实现。before方法共用三个参数，它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名称可以用作判断是否执行代码的条件。Object[] args是传给被调用的public方法的参数数组。当需要记日志时，参数args和被执行方法的名称，都是非常有用的信息。你也可以改变传给m的参数，但要小心使用这个功能；编写最初主程序的程序员并不知道主程序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用。 在下面的BeanImpl类中，每个public方法调用前，都会执行advice： </p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.company.springaop.test;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img id="Codehighlighter1_76_276_Open_Image" onclick="this.style.display='none'; Codehighlighter1_76_276_Open_Text.style.display='none'; Codehighlighter1_76_276_Closed_Image.style.display='inline'; Codehighlighter1_76_276_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_76_276_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_76_276_Closed_Text.style.display='none'; Codehighlighter1_76_276_Open_Image.style.display='inline'; Codehighlighter1_76_276_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BeanImpl&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Bean&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_76_276_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_76_276_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_106_273_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_273_Open_Text.style.display='none'; Codehighlighter1_106_273_Closed_Image.style.display='inline'; Codehighlighter1_106_273_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_106_273_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_106_273_Closed_Text.style.display='none'; Codehighlighter1_106_273_Open_Image.style.display='inline'; Codehighlighter1_106_273_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;theMethod()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_106_273_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_106_273_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getName()&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Exception().getStackTrace()[</span><span style="color: #000000">0</span><span style="color: #000000">].getMethodName()&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">()</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;says&nbsp;HELLO!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br />
类BeanImpl实现了下面的接口Bean： </p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.company.springaop.test;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img id="Codehighlighter1_60_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_60_91_Open_Text.style.display='none'; Codehighlighter1_60_91_Closed_Image.style.display='inline'; Codehighlighter1_60_91_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_60_91_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_60_91_Closed_Text.style.display='none'; Codehighlighter1_60_91_Open_Image.style.display='inline'; Codehighlighter1_60_91_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Bean&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_60_91_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_60_91_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;theMethod();&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;虽然不是必须使用接口，但面向接口而不是面向实现编程是良好的编程实践，Spring也鼓励这样做。 pointcut和advice通过配置文件来实现，因此，接下来你只需编写主方法的Java代码： </p>
<p><br />
&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.company.springaop.test;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.ApplicationContext;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.support.FileSystemXmlApplicationContext;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img id="Codehighlighter1_190_523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_190_523_Open_Text.style.display='none'; Codehighlighter1_190_523_Closed_Image.style.display='inline'; Codehighlighter1_190_523_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_190_523_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_190_523_Closed_Text.style.display='none'; Codehighlighter1_190_523_Open_Image.style.display='inline'; Codehighlighter1_190_523_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Main&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_190_523_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_190_523_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_235_520_Open_Image" onclick="this.style.display='none'; Codehighlighter1_235_520_Open_Text.style.display='none'; Codehighlighter1_235_520_Closed_Image.style.display='inline'; Codehighlighter1_235_520_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_235_520_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_235_520_Closed_Text.style.display='none'; Codehighlighter1_235_520_Open_Image.style.display='inline'; Codehighlighter1_235_520_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_235_520_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_235_520_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Read&nbsp;the&nbsp;configuration&nbsp;file&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileSystemXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">springconfig.xml</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Instantiate&nbsp;an&nbsp;object&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Bean&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Bean)&nbsp;ctx.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">bean</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Execute&nbsp;the&nbsp;public&nbsp;method&nbsp;of&nbsp;the&nbsp;bean&nbsp;(the&nbsp;test)&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;x.theMethod();&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;</p>
<p>我们从读入和处理配置文件开始，接下来马上要创建它。这个配置文件将作为粘合程序不同部分的&#8220;胶水&#8221;。读入和处理配置文件后，我们会得到一个创建工厂ctx。任何一个Spring管理的对象都必须通过这个工厂来创建。对象通过工厂创建后便可正常使用。 仅仅用配置文件便可把程序的每一部分组装起来。 </p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;&nbsp;"-//SPRING//DTD&nbsp;BEAN//EN"&nbsp;"http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">CONFIG</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="bean"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.aop.framework.ProxyFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="proxyInterfaces"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.company.springaop.test.Bean</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="target"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">local</span><span style="color: #0000ff">="beanTarget"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="interceptorNames"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">theAdvisor</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">CLASS</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="beanTarget"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.company.springaop.test.BeanImpl"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">ADVISOR</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">Note:&nbsp;An&nbsp;advisor&nbsp;assembles&nbsp;pointcut&nbsp;and&nbsp;advice</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="theAdvisor"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.aop.support.RegexpMethodPointcutAdvisor"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="advice"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">local</span><span style="color: #0000ff">="theBeforeAdvice"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="pattern"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;//pointcut?<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com\.company\.springaop\.test\.Bean\.theMethod</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">ADVICE</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="theBeforeAdvice"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.company.springaop.test.TestBeforeAdvice"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp; </p>
<p><br />
四个bean定义的次序并不重要。我们现在有了一个advice，一个包含了正则表达式pointcut的advisor， 一个主程序类和一个配置好的接口，通过工厂ctx，这个接口返回自己本身实现的一个引用。 BeanImpl 和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创建一个bean元素，并指定了一个实现类。这 就是全部的工作。advisor通过Spring framework提供的一个RegexMethodPointcutAdvisor类来实现。我 们用advisor的一个属性来指定它所需的advice-bean。第二个属性则用正则表达式定义了pointcut，确保 良好的性能和易读性。 最后配置的是bean，它可以通过一个工厂来创建。bean的定义看起来比实际上要 复杂。bean是ProxyFactoryBean的一个实现，它是Spring framework的一部分。这个bean的行为通过一下 的三个属性来定义： </p>
<p>&nbsp;</p>
<p><br />
属性proxyInterface定义了接口类。 属性target指向本地配置的一个bean，这个bean返回一个接口的实现。 属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。 注意，advisor列表的次序是非常重要的。 </p>
<p>&nbsp;</p>
<p>Spring工具 </p>
<p>虽然你可以手工修改Ant构建脚本，但使用SpringUI（译注：SpringUI现在是Spring framework的一部分，并改名 为spring-ide），使用Spring AOP变得很简单，只要点点鼠标即可。你可以把SpringUI安装成Eclipse的一个plug-in。 然后，你只需在你的project上右击鼠标，并选择&#8220;add Spring Project Nature&#8221;。在project属性中，你可以在&#8220;Spring Project&#8221;下添加Spring配置文件。在编译前把下面的类库加入project：aopalliance.jar，commons-logging.jar， jakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息： </p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;(logging&nbsp;information)&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />Hello&nbsp;world</span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;(by&nbsp;com.company.springaop.test.TestBeforeAdvice)&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />com.company.springaop.test.BeanImpl.theMethod()&nbsp;says&nbsp;HELLO</span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br />
优点和缺点 </p>
<p>Spring比起其他的framework更有优势，因为除了AOP以外，它提供了更多别的功能。 作为一个轻型framework，它在J2EE不同的部分都可以发挥作用。因此，即使不想使用Spring AOP， 你可能还是想使用Spring。另一个优点是，Spring并不要求开发团队所有的人员都会用它。 学习Spring应该从Spring reference的第一页开始。读了本文后，你应该可以更好地理解Spring reference了。 Spring唯一的缺点是缺乏更多的文档，但它的mailing list是个很好的补充，而且会不断地出现更多的文档。 </p>
</span>
<img src ="http://www.blogjava.net/yejiansuo/aggbug/335347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yejiansuo/" target="_blank">叶建锁</a> 2010-10-17 11:26 <a href="http://www.blogjava.net/yejiansuo/archive/2010/10/17/335347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 的两个实用简单知识</title><link>http://www.blogjava.net/yejiansuo/archive/2010/10/15/335221.html</link><dc:creator>叶建锁</dc:creator><author>叶建锁</author><pubDate>Fri, 15 Oct 2010 04:20:00 GMT</pubDate><guid>http://www.blogjava.net/yejiansuo/archive/2010/10/15/335221.html</guid><description><![CDATA[<br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/yejiansuo/1.jpg" width="615" height="336" /><br />
<br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/yejiansuo/2.jpg" width="724" height="204" />
 <img src ="http://www.blogjava.net/yejiansuo/aggbug/335221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yejiansuo/" target="_blank">叶建锁</a> 2010-10-15 12:20 <a href="http://www.blogjava.net/yejiansuo/archive/2010/10/15/335221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>