﻿<?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-BaoYaEr-文章分类-spring</title><link>http://www.blogjava.net/baoyaer/category/18159.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Wed, 16 May 2012 12:42:08 GMT</lastBuildDate><pubDate>Wed, 16 May 2012 12:42:08 GMT</pubDate><ttl>60</ttl><item><title>maven 的配置收藏</title><link>http://www.blogjava.net/baoyaer/articles/378325.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 16 May 2012 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/378325.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/378325.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/378325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/378325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/378325.html</trackback:ping><description><![CDATA[<div>http://yingzhuo.iteye.com/blog/1007839</div><img src ="http://www.blogjava.net/baoyaer/aggbug/378325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2012-05-16 16:54 <a href="http://www.blogjava.net/baoyaer/articles/378325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 事务详解，非常不错的一篇文章，留存</title><link>http://www.blogjava.net/baoyaer/articles/376480.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 24 Apr 2012 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/376480.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/376480.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/376480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/376480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/376480.html</trackback:ping><description><![CDATA[<div>spring:http://www.iteye.com/topic/78674<br />oracle:http://wangxingrui168.blog.51cto.com/3523914/827789</div><img src ="http://www.blogjava.net/baoyaer/aggbug/376480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2012-04-24 16:03 <a href="http://www.blogjava.net/baoyaer/articles/376480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring代码分析【转】</title><link>http://www.blogjava.net/baoyaer/articles/316530.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 25 Mar 2010 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/316530.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/316530.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/316530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/316530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/316530.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Spring中，IOC容器的重要地位我们就不多说了，对于Spring的使用者而言，IOC容器实际上是什么呢？我们可以说BeanFactory就是我们看到的IoC容器，当然了Spring为我们准备了许多种IoC容器来使用，这样可以方便我们从不同的层面，不同的资源位置，不同的形式的定义信息来建立我们需要的IoC容器。 在Spring中，最基本的IOC容器接口是BeanFactory - 这个接口...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/316530.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/316530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2010-03-25 15:20 <a href="http://www.blogjava.net/baoyaer/articles/316530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解惑 spring 嵌套事务 </title><link>http://www.blogjava.net/baoyaer/articles/248203.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 25 Dec 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/248203.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/248203.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/248203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/248203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/248203.html</trackback:ping><description><![CDATA[在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看, 绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义, 让我们来看一下TransactionDefinition 接口中的定义 ，在 spring 中一共定义了六种事务传播属性, 如果你觉得看起来不够直观, 那么我来转贴一个满大街都有的翻译 <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">PROPAGATION_REQUIRED&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;支持当前事务，如果当前没有事务，就新建一个事务。这是最常见的选择。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />PROPAGATION_SUPPORTS&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;支持当前事务，如果当前没有事务，就以非事务方式执行。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />PROPAGATION_MANDATORY&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;支持当前事务，如果当前没有事务，就抛出异常。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />PROPAGATION_REQUIRES_NEW&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;新建事务，如果当前存在事务，把当前事务挂起。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />PROPAGATION_NOT_SUPPORTED&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;以非事务方式执行操作，如果当前存在事务，就把当前事务挂起。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />PROPAGATION_NEVER&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;以非事务方式执行，如果当前存在事务，则抛出异常。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />PROPAGATION_NESTED&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;如果当前存在事务，则在嵌套事务内执行。如果当前没有事务，则进行与PROPAGATION_REQUIRED类似的操作。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />前六个策略类似于EJB&nbsp;CMT，第七个（PROPAGATION_NESTED）是Spring所提供的一个特殊变量。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />它要求事务管理器或者使用JDBC&nbsp;</span><span style="color: #000000">3.0</span><span style="color: #000000">&nbsp;Savepoint&nbsp;API提供嵌套事务行为（如Spring的DataSourceTransactionManager）&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
在我所见过的误解中, 最常见的是下面这种: <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">假如有两个业务接口&nbsp;ServiceA&nbsp;和&nbsp;ServiceB,&nbsp;其中&nbsp;ServiceA&nbsp;中有一个方法实现如下&nbsp;<br />
<img id="Codehighlighter1_55_93_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_93_Open_Text.style.display='none'; Codehighlighter1_55_93_Closed_Image.style.display='inline'; Codehighlighter1_55_93_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_55_93_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_55_93_Closed_Text.style.display='none'; Codehighlighter1_55_93_Open_Image.style.display='inline'; Codehighlighter1_55_93_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_55_93_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_55_93_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;事务属性配置为&nbsp;PROPAGATION_REQUIRED&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_111_155_Open_Image" onclick="this.style.display='none'; Codehighlighter1_111_155_Open_Text.style.display='none'; Codehighlighter1_111_155_Closed_Image.style.display='inline'; Codehighlighter1_111_155_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_111_155_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_111_155_Closed_Text.style.display='none'; Codehighlighter1_111_155_Open_Image.style.display='inline'; Codehighlighter1_111_155_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;methodA()&nbsp;</span><span id="Codehighlighter1_111_155_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_111_155_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;调用&nbsp;ServiceB&nbsp;的方法&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">ServiceB.methodB();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />那么如果&nbsp;ServiceB&nbsp;的&nbsp;methodB&nbsp;&nbsp;如果配置了事务,&nbsp;就必须配置为&nbsp;PROPAGATION_NESTED&nbsp;</span></div>
<p><br />
这种想法可能害了不少人, 认为 Service 之间应该避免互相调用, 其实根本不用担心这点，PROPAGATION_REQUIRED 已经说得很明白, <br />
如果当前线程中已经存在事务, 方法调用会加入此事务, 果当前没有事务，就新建一个事务, 所以 ServiceB#methodB() 的事务只要遵循最普通的规则配置为 PROPAGATION_REQUIRED 即可, 如果 ServiceB#methodB (我们称之为内部事务, 为下文打下基础) 抛了异常, 那么 ServiceA#methodA(我们称之为外部事务) 如果没有特殊配置此异常时事务提交 (即 +MyCheckedException的用法), 那么整个事务是一定要 rollback 的, 什么 Service 只能调 Dao 之类的言论纯属无稽之谈, spring 只负责配置了事务属性方法的拦截, 它怎么知道你这个方法是在 Service 还是 Dao 里 ? <br />
<br />
最容易弄混淆的其实是 PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED, 那么这两种方式又有何区别呢? 我简单的翻译一下 Juergen Hoeller 的话 : <br />
<span style="color: red">PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行.</span>&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; <span style="color: red">另一方面, PROPAGATION_NESTED 开始一个 "嵌套的" 事务,&nbsp; 它是已经存在事务的一个真正的子事务. 潜套事务开始执行时,&nbsp; 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交.</span> <br />
<br />
&nbsp;&nbsp;&nbsp; <span style="color: red">由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于, PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 潜套事务也会被 commit, 这个规则同样适用于 roll back.<br />
</span><br />
&nbsp;那么外部事务如何利用嵌套事务的 savepoint 特性呢, 我们用代码来说话 </p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_9_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_137_Open_Text.style.display='none'; Codehighlighter1_9_137_Closed_Image.style.display='inline'; Codehighlighter1_9_137_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_9_137_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_9_137_Closed_Text.style.display='none'; Codehighlighter1_9_137_Open_Image.style.display='inline'; Codehighlighter1_9_137_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">ServiceA&nbsp;</span><span id="Codehighlighter1_9_137_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_9_137_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_22_72_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_72_Open_Text.style.display='none'; Codehighlighter1_22_72_Closed_Image.style.display='inline'; Codehighlighter1_22_72_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_22_72_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_72_Closed_Text.style.display='none'; Codehighlighter1_22_72_Open_Image.style.display='inline'; Codehighlighter1_22_72_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_22_72_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_22_72_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;事务属性配置为&nbsp;PROPAGATION_REQUIRED&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_95_131_Open_Image" onclick="this.style.display='none'; Codehighlighter1_95_131_Open_Text.style.display='none'; Codehighlighter1_95_131_Closed_Image.style.display='inline'; Codehighlighter1_95_131_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_95_131_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_95_131_Closed_Text.style.display='none'; Codehighlighter1_95_131_Open_Image.style.display='inline'; Codehighlighter1_95_131_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;methodA()&nbsp;</span><span id="Codehighlighter1_95_131_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_95_131_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceB.methodB();&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_153_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_153_264_Open_Text.style.display='none'; Codehighlighter1_153_264_Closed_Image.style.display='inline'; Codehighlighter1_153_264_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_153_264_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_153_264_Closed_Text.style.display='none'; Codehighlighter1_153_264_Open_Image.style.display='inline'; Codehighlighter1_153_264_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />ServiceB&nbsp;</span><span id="Codehighlighter1_153_264_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_153_264_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_165_219_Open_Image" onclick="this.style.display='none'; Codehighlighter1_165_219_Open_Text.style.display='none'; Codehighlighter1_165_219_Closed_Image.style.display='inline'; Codehighlighter1_165_219_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_165_219_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_165_219_Closed_Text.style.display='none'; Codehighlighter1_165_219_Open_Image.style.display='inline'; Codehighlighter1_165_219_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_165_219_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_165_219_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;事务属性配置为&nbsp;PROPAGATION_REQUIRES_NEW&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_244_253_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_253_Open_Text.style.display='none'; Codehighlighter1_244_253_Closed_Image.style.display='inline'; Codehighlighter1_244_253_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_244_253_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_244_253_Closed_Text.style.display='none'; Codehighlighter1_244_253_Open_Image.style.display='inline'; Codehighlighter1_244_253_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;methodB()&nbsp;</span><span id="Codehighlighter1_244_253_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_244_253_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span></div>
<p>这种情况下, 因为 ServiceB#methodB 的事务属性为 PROPAGATION_REQUIRES_NEW, 所以两者不会发生任何关系, ServiceA#methodA 和 ServiceB#methodB 不会因为对方的执行情况而影响事务的结果, 因为它们根本就是两个事务, 在 ServiceB#methodB 执行时 ServiceA#methodA 的事务已经挂起了 (关于事务挂起的内容已经超出了本文的讨论范围, 有时间我会再写一些挂起的文章) . <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_9_139_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_139_Open_Text.style.display='none'; Codehighlighter1_9_139_Closed_Image.style.display='inline'; Codehighlighter1_9_139_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_9_139_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_9_139_Closed_Text.style.display='none'; Codehighlighter1_9_139_Open_Image.style.display='inline'; Codehighlighter1_9_139_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">ServiceA&nbsp;</span><span id="Codehighlighter1_9_139_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_9_139_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_21_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_21_71_Open_Text.style.display='none'; Codehighlighter1_21_71_Closed_Image.style.display='inline'; Codehighlighter1_21_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_21_71_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_21_71_Closed_Text.style.display='none'; Codehighlighter1_21_71_Open_Image.style.display='inline'; Codehighlighter1_21_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_21_71_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_21_71_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;事务属性配置为&nbsp;PROPAGATION_REQUIRED&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_94_134_Open_Image" onclick="this.style.display='none'; Codehighlighter1_94_134_Open_Text.style.display='none'; Codehighlighter1_94_134_Closed_Image.style.display='inline'; Codehighlighter1_94_134_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_94_134_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_94_134_Closed_Text.style.display='none'; Codehighlighter1_94_134_Open_Image.style.display='inline'; Codehighlighter1_94_134_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;methodA()&nbsp;</span><span id="Codehighlighter1_94_134_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_94_134_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceB.methodB();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_155_263_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_263_Open_Text.style.display='none'; Codehighlighter1_155_263_Closed_Image.style.display='inline'; Codehighlighter1_155_263_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_155_263_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_155_263_Closed_Text.style.display='none'; Codehighlighter1_155_263_Open_Image.style.display='inline'; Codehighlighter1_155_263_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />ServiceB&nbsp;</span><span id="Codehighlighter1_155_263_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_155_263_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_170_218_Open_Image" onclick="this.style.display='none'; Codehighlighter1_170_218_Open_Text.style.display='none'; Codehighlighter1_170_218_Closed_Image.style.display='inline'; Codehighlighter1_170_218_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_170_218_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_170_218_Closed_Text.style.display='none'; Codehighlighter1_170_218_Open_Image.style.display='inline'; Codehighlighter1_170_218_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_170_218_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_170_218_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;事务属性配置为&nbsp;PROPAGATION_NESTED&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_243_252_Open_Image" onclick="this.style.display='none'; Codehighlighter1_243_252_Open_Text.style.display='none'; Codehighlighter1_243_252_Closed_Image.style.display='inline'; Codehighlighter1_243_252_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_243_252_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_243_252_Closed_Text.style.display='none'; Codehighlighter1_243_252_Open_Image.style.display='inline'; Codehighlighter1_243_252_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;methodB()&nbsp;</span><span id="Codehighlighter1_243_252_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_243_252_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<p>ServiceB#methodB 如果 rollback, 那么内部事务(即 ServiceB#methodB) 将回滚到它执行前的 SavePoint(注意, 这是本文中第一次提到它, 潜套事务中最核心的概念), 而外部事务(即 ServiceA#methodA) 可以有以下两种处理方式: <br />
1. 改写 ServiceA 如下 <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_9_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_259_Open_Text.style.display='none'; Codehighlighter1_9_259_Closed_Image.style.display='inline'; Codehighlighter1_9_259_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_9_259_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_9_259_Closed_Text.style.display='none'; Codehighlighter1_9_259_Open_Image.style.display='inline'; Codehighlighter1_9_259_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">ServiceA&nbsp;</span><span id="Codehighlighter1_9_259_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_9_259_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_21_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_21_71_Open_Text.style.display='none'; Codehighlighter1_21_71_Closed_Image.style.display='inline'; Codehighlighter1_21_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_21_71_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_21_71_Closed_Text.style.display='none'; Codehighlighter1_21_71_Open_Image.style.display='inline'; Codehighlighter1_21_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_21_71_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_21_71_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;事务属性配置为&nbsp;PROPAGATION_REQUIRED&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_94_253_Open_Image" onclick="this.style.display='none'; Codehighlighter1_94_253_Open_Text.style.display='none'; Codehighlighter1_94_253_Closed_Image.style.display='inline'; Codehighlighter1_94_253_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_94_253_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_94_253_Closed_Text.style.display='none'; Codehighlighter1_94_253_Open_Image.style.display='inline'; Codehighlighter1_94_253_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;methodA()&nbsp;</span><span id="Codehighlighter1_94_253_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_94_253_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_111_159_Open_Image" onclick="this.style.display='none'; Codehighlighter1_111_159_Open_Text.style.display='none'; Codehighlighter1_111_159_Closed_Image.style.display='inline'; Codehighlighter1_111_159_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_111_159_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_111_159_Closed_Text.style.display='none'; Codehighlighter1_111_159_Open_Image.style.display='inline'; Codehighlighter1_111_159_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_111_159_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_111_159_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceB.methodB();&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_183_244_Open_Image" onclick="this.style.display='none'; Codehighlighter1_183_244_Open_Text.style.display='none'; Codehighlighter1_183_244_Closed_Image.style.display='inline'; Codehighlighter1_183_244_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_183_244_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_183_244_Closed_Text.style.display='none'; Codehighlighter1_183_244_Open_Image.style.display='inline'; Codehighlighter1_183_244_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(SomeException)&nbsp;</span><span id="Codehighlighter1_183_244_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_183_244_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;执行其他业务,&nbsp;如&nbsp;ServiceC.methodC();&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;</span></div>
<p>这种方式也是潜套事务最有价值的地方, 它起到了分支执行的效果, 如果 ServiceB.methodB 失败, 那么执行 ServiceC.methodC(), 而 ServiceB.methodB 已经回滚到它执行之前的 SavePoint, 所以不会产生脏数据(相当于此方法从未执行过), 这种特性可以用在某些特殊的业务中, 而 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 都没有办法做到这一点. (题外话 : 看到这种代码, 似乎似曾相识, 想起了 prototype.js 中的 Try 函数 ) <br />
<br />
2. 代码不做任何修改, 那么如果内部事务(即 ServiceB#methodB) rollback, 那么首先 ServiceB.methodB 回滚到它执行之前的 SavePoint(在任何情况下都会如此),&nbsp;外部事务(即 ServiceA#methodA) 将根据具体的配置决定自己是 commit 还是 rollback (+MyCheckedException).&nbsp;<br />
上面大致讲述了潜套事务的使用场景, 下面我们来看如何在 spring 中使用 PROPAGATION_NESTED, 首先来看 AbstractPlatformTransactionManager <br />
<br />
JdbcTransactionObjectSupport 告诉我们必须要满足两个条件才能 createSavepoint : <br />
&nbsp; <br />
<span style="color: red">2. java.sql.Savepoint 必须存在, 即 jdk 版本要 1.4+ <br />
3. Connection.getMetaData().supportsSavepoints() 必须为 true, 即 jdbc drive 必须支持 JDBC 3.0 </span><br />
<br />
确保以上条件都满足后, 你就可以尝试使用 PROPAGATION_NESTED 了.<br />
</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/248203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-12-25 10:08 <a href="http://www.blogjava.net/baoyaer/articles/248203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.5注释语法</title><link>http://www.blogjava.net/baoyaer/articles/239834.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 11 Nov 2008 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/239834.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/239834.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/239834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/239834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/239834.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring的IoCpublic&nbsp;class&nbsp;Foo&nbsp;{①&nbsp;&nbsp;private&nbsp;String&nbsp;name;&nbsp;&nbsp;private&nbsp;int&nbsp;age;&nbsp;&nbsp;public&nbsp;String&nbsp;toString(){&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/239834.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/239834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-11-11 11:36 <a href="http://www.blogjava.net/baoyaer/articles/239834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz 在Spring中动态设置cronExpression [zt]</title><link>http://www.blogjava.net/baoyaer/articles/222721.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 18 Aug 2008 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/222721.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/222721.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/222721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/222721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/222721.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 版权所有：(xiaodaoxiaodao)蓝小刀 &nbsp;&nbsp; xiaodaoxiaodao@gmail.com http://www.blogjava.net/xiaodaoxiaodao/articles/103437.html &nbsp; &nbsp; &nbsp; &nbsp; 转载请注明来源/作者 Quartz 在Spring中动态设置cronExpressio...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/222721.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/222721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-08-18 11:53 <a href="http://www.blogjava.net/baoyaer/articles/222721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring+atomikos+JTA完整例子 </title><link>http://www.blogjava.net/baoyaer/articles/208872.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 18 Jun 2008 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/208872.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/208872.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/208872.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/208872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/208872.html</trackback:ping><description><![CDATA[jotm真是个烂东西，不能回滚，导致系统出现了很多问题，深受其害，决心换个东东，在网上找到了atomikos，做下记录<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;"-//SPRING//DTD&nbsp;BEAN&nbsp;2.0//EN"&nbsp;"http://www.springframework.org/dtd/spring-beans-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans&nbsp;</span><span style="color: #ff0000">default-autowire</span><span style="color: #0000ff">="byName"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="atomikosUserTransaction"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.atomikos.icatch.jta.UserTransactionImp"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="atomikosTransactionManager"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.atomikos.icatch.jta.UserTransactionManager"</span><span style="color: #ff0000">&nbsp;init-method</span><span style="color: #0000ff">="init"</span><span style="color: #ff0000">&nbsp;destroy-method</span><span style="color: #0000ff">="close"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;&nbsp;when&nbsp;close&nbsp;is&nbsp;called,&nbsp;should&nbsp;we&nbsp;force&nbsp;transactions&nbsp;to&nbsp;terminate&nbsp;or&nbsp;not?&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="forceShutdown"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="txManager"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.transaction.jta.JtaTransactionManager"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">="transactionManager"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="atomikosTransactionManager"</span><span style="color: #ff0000">&nbsp;&nbsp;</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">="userTransaction"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="atomikosUserTransaction"</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&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">="auditDS"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="com.atomikos.jdbc.AtomikosDataSourceBean"</span><span style="color: #ff0000">&nbsp;init-method</span><span style="color: #0000ff">="init"</span><span style="color: #ff0000">&nbsp;destroy-method</span><span style="color: #0000ff">="close"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">="uniqueResourceName"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">mysql/cnaudit</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">="xaDataSourceClassName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">="xaProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="user"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XXX</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="password"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XXX</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="URL"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XXX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">="poolSize"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">50</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&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">="oracleDS"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="com.atomikos.jdbc.AtomikosDataSourceBean"</span><span style="color: #ff0000">&nbsp;init-method</span><span style="color: #0000ff">="init"</span><span style="color: #ff0000">&nbsp;destroy-method</span><span style="color: #0000ff">="close"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">="uniqueResourceName"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">oracle/cnaudit</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">="xaDataSourceClassName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">oracle.jdbc.xa.client.OracleXADataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">="xaProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="user"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XXX</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="password"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XXX</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="URL"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XXX<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="sqlMapClient"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.ibatis.SqlMapClientFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">="configLocation"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff">="classpath:ibatis/SqlMapConfig.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">="dataSource"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="auditDS"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="sqlMapClientTemplate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.ibatis.SqlMapClientTemplate"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="oraSqlMapClient"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.ibatis.SqlMapClientFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">="configLocation"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff">="classpath:ibatis/SqlMapConfig-oracle.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">="dataSource"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="oracleDS"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="oraSqlMapClientTemplate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.ibatis.SqlMapClientTemplate"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">="sqlMapClient"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="oraSqlMapClient"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
在配置一下事物管理，ok
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="color: #0000ff">="http://www.springframework.org/schema/aop"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx</span><span style="color: #0000ff">="http://www.springframework.org/schema/tx"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop&nbsp;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/tx&nbsp;http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default-autowire</span><span style="color: #0000ff">="byName"</span><span style="color: #ff0000">&nbsp;default-lazy-init</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;支持&nbsp;@AspectJ&nbsp;标记</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:aspectj-autoproxy</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:config&nbsp;</span><span style="color: #ff0000">proxy-target-class</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:advisor&nbsp;</span><span style="color: #ff0000">pointcut</span><span style="color: #0000ff">="execution(*&nbsp;*Facade.*(..))"</span><span style="color: #ff0000">&nbsp;advice-ref</span><span style="color: #0000ff">="txAdvice"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:advisor&nbsp;</span><span style="color: #ff0000">pointcut</span><span style="color: #0000ff">="execution(*&nbsp;*Manager.*(..))"</span><span style="color: #ff0000">&nbsp;advice-ref</span><span style="color: #0000ff">="txAdvice"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">aop:config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:advice&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="txAdvice"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:attributes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="get*"</span><span style="color: #ff0000">&nbsp;read-only</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="find*"</span><span style="color: #ff0000">&nbsp;read-only</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="has*"</span><span style="color: #ff0000">&nbsp;read-only</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="locate*"</span><span style="color: #ff0000">&nbsp;read-only</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tx:attributes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tx:advice</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/208872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-06-18 14:54 <a href="http://www.blogjava.net/baoyaer/articles/208872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring+hibernate的clob大字段处理（转载于javaeye论坛） </title><link>http://www.blogjava.net/baoyaer/articles/204004.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 30 May 2008 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/204004.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/204004.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/204004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/204004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/204004.html</trackback:ping><description><![CDATA[<span class="genmed">
<p>spring+hibernate的clob大字段处理（转载于javaeye论坛） </p>
<p>在spring中如何处理oracle大字段 </p>
<p>在spring中采用OracleLobHandler来处理oracle大字段（包括clob和blob），则在程序中不需要引用oracle的特殊类，从而能够保证支持我们的代码支持多数据库。 </p>
<p>1、首先数据表中的clob类型对应java持久化类的String类型；而blob类型对应byte[]类型 <br />
2、定义hibernate标签时，持久化类中对应clob类型的属性的hibernate type应为org.springframework.orm.hibernate.support.ClobStringType；而对应blob类型的属性的hibernate type应为org.springframework.orm.hibernate.support.BlobByteArrayType。 <br />
3、以后访问这些对应clob和blob类型的属性时，按普通属性处理，不需要特别编码。 </p>
<p>java代码:&nbsp;&nbsp; <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">id&nbsp;</span><span style="color: #0000ff">="mySessionFactory2"</span><span style="color: #ff0000">&nbsp;&nbsp;class&nbsp;</span><span style="color: #0000ff">="org.springframework.orm.hibernate.LocalSessionFactoryBean"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="myDataSource2"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="lobHandler"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="oracleLobHandle"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;bean&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">id&nbsp;</span><span style="color: #0000ff">="nativeJdbcExtractor"</span><span style="color: #ff0000">&nbsp;&nbsp;class&nbsp;</span><span style="color: #0000ff">="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">id&nbsp;</span><span style="color: #0000ff">="oracleLobHandle"</span><span style="color: #ff0000">&nbsp;&nbsp;class&nbsp;</span><span style="color: #0000ff">="org.springframework.jdbc.support.lob.OracleLobHandler"</span><span style="color: #ff0000">&nbsp;&nbsp;Lazy-init&nbsp;</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="nativeJdbcExtractor"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">local&nbsp;</span><span style="color: #0000ff">="nativejdbcExtractor"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;bean&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<br />
Spring为处理数据库Lob字段，特别提供了LobHandler接口。在操作Oracle RDBMS过程中，由于Oracle JDBC Driver实现的问题，应用必须采用Oracle原生的数据库连接（比如，oracle.jdbc.OracleConnection）、LOB原生实现（比如，oracle.sql.BLOB、oracle.sql.CLOB）。因此，LobHandler接口存在上述两种实现。简而言之，为操作Oracle数据库，必须使用OracleLobHandler实现。如果操作其他RDBMS类型，则使用DefaultLobHandler。NativeJdbcExtractor是个接口，通过它能够抽象各种连接池。另外Spring还提供两个接口存取Blob，LobCreator及LobHandler <br />
<br />
hbm文件配置<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="content"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="C_Content"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.support.ClobStringType"</span><span style="color: #ff0000"> <br />
length</span><span style="color: #0000ff">="10000"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
<p><font face="Arial" size="2">&nbsp;JavaBean的对应的属性类型为String。</font> <br />
<br />
需要注意两点：(1)如果使用Oracle9i自带的class12.jar这个JDBC驱动的话是不行的，会报错，据说要升级到classes12-9i.jar，我在Oracle的网站上没找到对应的下载，下载了ojdbc14.jar就可以了。(2)对Clob或Blog的操作必须在一个事务中进行，如在Dao层测试会出错，在配置了事务的Logic层就没问题了。 </p>
<p><font face="Arial"><font size="2">经过测试,如果用Oracle10g的JDBC驱动就没这么麻烦了，Hibernate+Oracle+CLOB的读写其实只要这样做：</font> </font></p>
<p><font face="Arial" size="2">1.在Oracle里设置某字段为clob类型。<br />
2.在Hibernate的配置文件里使用网上下载的Oracle 10g最新的jdbc驱动。<br />
3.实体类里把clob字段对应的属性类型设置为String。<br />
4.hibernate的映射文件*.hbm.xml里把该字段对应的类型该为text。</font> </p>
<p><font face="Arial" size="2">然后就可以在程序里把它当成String随便用了。</font> </p>
<p><font face="Arial" size="2">补充：按照上面的方法又写了一个测试类，能够操作Clob字段了，但是启动JBOSS后就不能用了，后来找了很久才发现，原来我用的JBOSS的default/lib目录下也有一下老版本的Class12.jar，删除它换成最新的ojdbc14.jar就可以了。<br />
</font></p>
<br />
</span>
<img src ="http://www.blogjava.net/baoyaer/aggbug/204004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-30 09:30 <a href="http://www.blogjava.net/baoyaer/articles/204004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通用Dao  设计 2</title><link>http://www.blogjava.net/baoyaer/articles/203382.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 28 May 2008 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/203382.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/203382.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/203382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/203382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/203382.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 泛型是JDK1.5的一个新的特性，使用泛型机制编写的程序代码要比那些杂乱的使用Object变量，然后再进行强制类型转换的代码具有更好的安全性和可读性。如果你的系统运行在JDK1.5以上的版本上，建议多使用泛型来代替无休止的对象转换。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在软件设计中我们开始对系统进行三层甚至是多层架构了，...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/203382.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/203382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-28 09:23 <a href="http://www.blogjava.net/baoyaer/articles/203382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring +hibernate 启动优化【转】</title><link>http://www.blogjava.net/baoyaer/articles/194713.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 22 Apr 2008 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/194713.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/194713.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/194713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/194713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/194713.html</trackback:ping><description><![CDATA[<p>最近在负责一个大项目，项目组成员包括项目经理大概10个人左右。项目技术用struts+spring+hibernate实现。项目的规<br />
模相对来说是比较大的，总共有10大模块，每个大模块又分为有十几个、甚至几十个小模块。开发工具用eclipse，由于在<br />
开发阶段，项目开发成员需要频繁重启服务器。在启动服务器的时候，每次启动时间总是会超过1分钟。记得以前在做另外<br />
一个项目时，启动时间不到5秒钟，相差了10倍，而且项目规模是差不多的。</p>
<p>从初步分析来说，应该是hibernate解释hbm.xml时花费时间，或者可能是spring容器启动并解释所有的bean配置文件 。诊<br />
断了一下，发现1分钟消耗的时间主要分布在hibernate解释hbm.xml花费5秒；spring容器从启动到解释bean配置文件竟然<br />
花了58秒，真是太嚣张了。当时非常怀疑spring的效率问题。企图从网上搜索相关资料，看看有什么优化措施。<br />
<br />
首先是找到了hibernate的启动优化 http://www.hibernate.org/194.html&nbsp; 里面的主要思想是通过将xml序列花到本地的<br />
文件里，每次读取的时候根据情况，从本地文件读取并反序列化，节省了hibernate xml的解析时间。按照这个方式测试了<br />
一下，发现hibernate的启动时间从5秒降低到3秒，但是这个优化对于整个启动过程是杯水车薪的，毫无用处。<br />
下面是hibernate的优化代码：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_77_1405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_77_1405_Open_Text.style.display='none'; Codehighlighter1_77_1405_Closed_Image.style.display='inline'; Codehighlighter1_77_1405_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_77_1405_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_77_1405_Closed_Text.style.display='none'; Codehighlighter1_77_1405_Open_Image.style.display='inline'; Codehighlighter1_77_1405_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Configuration&nbsp;addCachableFile(String&nbsp;xmlFile)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;MappingException&nbsp;</span><span id="Codehighlighter1_77_1405_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_77_1405_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_99_1235_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_1235_Open_Text.style.display='none'; Codehighlighter1_99_1235_Closed_Image.style.display='inline'; Codehighlighter1_99_1235_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_99_1235_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_1235_Closed_Text.style.display='none'; Codehighlighter1_99_1235_Open_Image.style.display='inline'; Codehighlighter1_99_1235_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_99_1235_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_99_1235_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(xmlFile);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;lazyfile&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(xmlFile&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">.bin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.Document&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;errors&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br />
<img id="Codehighlighter1_385_682_Open_Image" onclick="this.style.display='none'; Codehighlighter1_385_682_Open_Text.style.display='none'; Codehighlighter1_385_682_Closed_Image.style.display='inline'; Codehighlighter1_385_682_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_385_682_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_385_682_Closed_Text.style.display='none'; Codehighlighter1_385_682_Open_Image.style.display='inline'; Codehighlighter1_385_682_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(file.exists()&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;lazyfile.exists()&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;file.lastModified()</span><span style="color: #000000">&lt;</span><span style="color: #000000">lazyfile.lastModified())&nbsp;</span><span id="Codehighlighter1_385_682_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_385_682_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">Mapping&nbsp;lazy&nbsp;file:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;lazyfile.getPath());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;oip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ObjectInputStream(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileInputStream(lazyfile));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(org.dom4j.Document)&nbsp;oip.readObject();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oip.close();&nbsp;<br />
<img id="Codehighlighter1_689_1053_Open_Image" onclick="this.style.display='none'; Codehighlighter1_689_1053_Open_Text.style.display='none'; Codehighlighter1_689_1053_Closed_Image.style.display='inline'; Codehighlighter1_689_1053_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_689_1053_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_689_1053_Closed_Text.style.display='none'; Codehighlighter1_689_1053_Open_Image.style.display='inline'; Codehighlighter1_689_1053_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_689_1053_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_689_1053_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlHelper.createSAXReader(xmlFile,&nbsp;errors,&nbsp;entityResolver).read(&nbsp;file&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">Writing&nbsp;lazy&nbsp;file&nbsp;to&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;lazyfile);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;oup&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ObjectOutputStream(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(lazyfile));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oup.writeObject(doc);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oup.flush();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oup.close();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;errors.size()</span><span style="color: #000000">!=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MappingException(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">invalid&nbsp;mapping</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;(Throwable)&nbsp;errors.get(</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(doc);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1265_1399_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1265_1399_Open_Text.style.display='none'; Codehighlighter1_1265_1399_Closed_Image.style.display='inline'; Codehighlighter1_1265_1399_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1265_1399_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1265_1399_Closed_Text.style.display='none'; Codehighlighter1_1265_1399_Open_Image.style.display='inline'; Codehighlighter1_1265_1399_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_1265_1399_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1265_1399_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</span><span style="color: #000000">"</span><span style="color: #000000">Could&nbsp;not&nbsp;configure&nbsp;datastore&nbsp;from&nbsp;file:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;xmlFile,&nbsp;e);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MappingException(e);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
没办法，又仔细查看了spring的资料，终于发现spring的容器是提供了lazy-load的，即默认的缺省设置是bean没有lazy- load，<br />
该属性处于false状态，这样导致spring在启动过程导致在启动时候，会默认加载整个对象实例图，从初始化ACTION配置、<br />
到 service配置到dao配置、乃至到数据库连接、事务等等。这么庞大的规模，难怪spring的启动时间要花将近1分钟。尝<br />
试了一下，把beans的 default-lazy-init改为true就，再次启动，速度从原来的55秒，降到8秒钟！！Great！虽然是非常<br />
小一个改动，但是影响确实非常大。一个项目组10个人，假若每个人一天平均需要在eclipse下启动测试服务器50次。那么<br />
一天项目组需要重启500次，每次节省50秒的话，就是 25000秒，将近几个小时，差不多一个工作日，多么可观的数字！<br />
<p>&nbsp;<br />
不过在运行期间第一次点页面的时候，由于spring做了lazy-load，现在就需要启动一部分需要的beans，所以稍微慢2－3<br />
&nbsp;秒钟，但是明显比等几十秒要快很多，值得一鉴。</p>
<p>&nbsp;以上是针对开发阶段的spring容器启动优化，在部署到实际环境中，倒是没必要设置为lazy-load。毕竟部署到实际环境<br />
&nbsp;中不是经常的事，每次启动1分钟倒不是大问题。 </p>
<p>我这里要提醒的是不是说有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;beans&nbsp;&nbsp;</span><span style="color: #ff0000">default-lazy-init&nbsp;</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">class&nbsp;</span><span style="color: #0000ff">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="triggers"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;list&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="buildHtmlTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="askTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="mailSenderTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="topicDetailBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="forumBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="topicBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;list&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;bean&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;beans&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
这样的话。所有的scheduler就都不管用了。所以请大家要注意。下面这样才是可以执行的<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;beans&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;bean&nbsp;&nbsp;</span><span style="color: #ff0000">class&nbsp;</span><span style="color: #0000ff">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;property&nbsp;&nbsp;</span><span style="color: #ff0000">name&nbsp;</span><span style="color: #0000ff">="triggers"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;list&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="buildHtmlTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="askTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="mailSenderTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="topicDetailBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="forumBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #ff0000">bean&nbsp;</span><span style="color: #0000ff">="topicBuildTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;list&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;property&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;bean&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">&nbsp;beans&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/194713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-04-22 11:00 <a href="http://www.blogjava.net/baoyaer/articles/194713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 的OpenSessionInViewFilter简介</title><link>http://www.blogjava.net/baoyaer/articles/189331.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 28 Mar 2008 10:27:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/189331.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/189331.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/189331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/189331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/189331.html</trackback:ping><description><![CDATA[<div class="postText">
<p>假设在你的应用中Hibernate是通过spring 来管理它的session.如果在你的应用中没有使用OpenSessionInViewFilter或者OpenSessionInViewInterceptor。session会在transaction结束后关闭。<br />
如果你采用了spring的声明式事务模式，它会对你的被代理对象的每一个方法进行事务包装（AOP的方式）。如下：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&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">="txProxyTemplate"</span><span style="color: #ff0000">&nbsp;abstract</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">="transactionManager"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">="transactionAttributes"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="save*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="remove*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED,readOnly</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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">="manager"</span><span style="color: #ff0000">&nbsp;parent</span><span style="color: #0000ff">="txProxyTemplate"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.appfuse.service.impl.BaseManager"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">="dao"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="dao"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&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"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>目标类org.appfuse.service.impl.BaseManager 的&nbsp; save *方法的事务类型PROPAGATION_REQUIRED&nbsp; ，remove* 方法的事务类型PROPAGATION_REQUIRED<br />
其他的方法的事务类型是PROPAGATION_REQUIRED,readOnly。<br />
所以给你的感觉是调用这个名为&#8220;manager&#8221;的bean的方法之后session就关掉了。<br />
如果应用中使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor，所有打开的session会被保存在一个线程变量里。在线程退出前通过<br />
OpenSessionInViewFilter或者OpenSessionInViewInterceptor断开这些session。 为什么这么做？这主要是为了实现Hibernate的延迟加载功能。基于一个请求<br />
一个hibernate session的原则。</p>
<p>spring中对OpenSessionInViewFilter的描述如下：<br />
它是一个Servlet2.3过滤器，用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现"Open Session in View"的模式。<br />
例如： 它允许在事务提交之后延迟加载显示所需要的对象。</p>
<p>这个过滤器和 HibernateInterceptor 有点类似：它是通过线程实现的。无论是没有事务的应用，还是有业务层事务的应用（通过HibernateTransactionManager 或<br />
JtaTransactionManager的方式实现）它都适用。在后一种情况下，事务会自动采用由这个filter绑定的Session来进行相关的操作以及根据实际情况完成提交操作。</p>
<p>警告： 如果在你的应用中，一次请求的过程中使用了单一的一个HIbernate Session，在这种情况下，采用这个filter会产生一些以前没遇到的问题。特别需要注意的是通过<br />
Hibernate Session重新组织持久化对象之间关系的相关操作需要在请求的最开始进行。以免与已经加载的相同对象发生冲突。</p>
<p>或者，我们可以通过指定"singleSession"="false"的方式把这个过滤器调到延期关闭模式。这样在一次请求的过程中不会使用一个单一的Session.每一次数据访问或事务相关<br />
操作都使用属于它自己的session(有点像不使用Open Session in View).这些session都被注册成延迟关闭模式，即使是在这一次的请求中它相关操作已经完成。</p>
<p>"一次请求一个session" 对于一级缓存而言很有效，但是这样可以带来副作用。例如在saveOrUpdate的时候或事物回滚之后，虽然它和&#8220;no Open Session in View&#8221;同样安全。<br />
但是它却允许延迟加载。</p>
<p>它会在spring的web应用的上下文根中查找Session工厂。它也支持通过在web.xml中定义的&#8220;SessionFactoryBeanName&#8221;的init-param元素 指定的Session工厂对应的bean的<br />
名字来查找session工厂。默认的bean的名字是"sessionFactory".他通过每一次请求查找一次SessionFactory的方式来避免由初始化顺序引起的问题（当使用ContextLoaderServlet<br />
来集成spring的时候 ，spring 的应用上下文是在这个filter 之后才被初始化的）。</p>
<p>默认的情况下，这个filter 不会同步Hibernate Session.这是因为它认为这项工作是通过业务层的事务来完成的。而且HibernateAccessors 的FlushMode为FLUSH_EAGER.如果你<br />
想让这个filter在请求完成以后同步session.你需要覆盖它的closeSession方法，在这个方法中在调用父类的关闭session操作之前同步session.此外你需要覆盖它的getSession()<br />
方法。返回一个session它的FlushMode 不是默认的FlushMode.NEVER。需要注意的是getSession()和closeSession()方法只有在single session的模式中才被调用。</p>
<p>在myfaces的wiki里提供了OpenSessionInViewFilter的一个子类如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_112_818_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_818_Open_Text.style.display='none'; Codehighlighter1_112_818_Closed_Image.style.display='inline'; Codehighlighter1_112_818_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_112_818_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_112_818_Closed_Text.style.display='none'; Codehighlighter1_112_818_Open_Image.style.display='inline'; Codehighlighter1_112_818_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;OpenSessionInViewFilter&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&nbsp;</span><span id="Codehighlighter1_112_818_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_112_818_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_130_220_Open_Image" onclick="this.style.display='none'; Codehighlighter1_130_220_Open_Text.style.display='none'; Codehighlighter1_130_220_Closed_Image.style.display='inline'; Codehighlighter1_130_220_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_130_220_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_130_220_Closed_Text.style.display='none'; Codehighlighter1_130_220_Open_Image.style.display='inline'; Codehighlighter1_130_220_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_130_220_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_130_220_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;we&nbsp;do&nbsp;a&nbsp;different&nbsp;flushmode&nbsp;than&nbsp;in&nbsp;the&nbsp;codebase<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;here<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_332_518_Open_Image" onclick="this.style.display='none'; Codehighlighter1_332_518_Open_Text.style.display='none'; Codehighlighter1_332_518_Closed_Image.style.display='inline'; Codehighlighter1_332_518_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_332_518_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_332_518_Closed_Text.style.display='none'; Codehighlighter1_332_518_Open_Image.style.display='inline'; Codehighlighter1_332_518_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Session&nbsp;getSession(SessionFactory&nbsp;sessionFactory)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;DataAccessResourceFailureException&nbsp;</span><span id="Codehighlighter1_332_518_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_332_518_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SessionFactoryUtils.getSession(sessionFactory,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setFlushMode(FlushMode.COMMIT);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;session;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_528_640_Open_Image" onclick="this.style.display='none'; Codehighlighter1_528_640_Open_Text.style.display='none'; Codehighlighter1_528_640_Closed_Image.style.display='inline'; Codehighlighter1_528_640_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_528_640_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_528_640_Closed_Text.style.display='none'; Codehighlighter1_528_640_Open_Image.style.display='inline'; Codehighlighter1_528_640_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_528_640_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_528_640_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;we&nbsp;do&nbsp;an&nbsp;explicit&nbsp;flush&nbsp;here&nbsp;just&nbsp;in&nbsp;case<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;we&nbsp;do&nbsp;not&nbsp;have&nbsp;an&nbsp;automated&nbsp;flush<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_719_816_Open_Image" onclick="this.style.display='none'; Codehighlighter1_719_816_Open_Text.style.display='none'; Codehighlighter1_719_816_Closed_Image.style.display='inline'; Codehighlighter1_719_816_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_719_816_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_719_816_Closed_Text.style.display='none'; Codehighlighter1_719_816_Open_Image.style.display='inline'; Codehighlighter1_719_816_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;closeSession(Session&nbsp;session,&nbsp;SessionFactory&nbsp;factory)&nbsp;</span><span id="Codehighlighter1_719_816_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_719_816_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.flush();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.closeSession(session,&nbsp;factory);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
&nbsp;</p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/189331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-03-28 18:27 <a href="http://www.blogjava.net/baoyaer/articles/189331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个通用dao的实现</title><link>http://www.blogjava.net/baoyaer/articles/188464.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 25 Mar 2008 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/188464.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/188464.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/188464.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/188464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/188464.html</trackback:ping><description><![CDATA[<p>import java.io.*;<br />
import java.util.*;</p>
<p>/**<br />
&nbsp;* 通用DAO，用于对象的持久化、查询（分页）<br />
&nbsp;* <br />
&nbsp;* @author SunHui<br />
&nbsp;* <br />
&nbsp;*/<br />
public interface Dao {<br />
&nbsp;/**<br />
&nbsp; * 保存（持久化）一个对象<br />
&nbsp; * <br />
&nbsp; * @param object<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要保存的对象<br />
&nbsp; */<br />
&nbsp;public void save(Object object);</p>
<p>&nbsp;/**<br />
&nbsp; * 更新一个对象<br />
&nbsp; * <br />
&nbsp; * @param object<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要修改的对象<br />
&nbsp; */<br />
&nbsp;public void update(Object object);</p>
<p>&nbsp;/**<br />
&nbsp; * 用语句更新记录<br />
&nbsp; * <br />
&nbsp; * @param queryString<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询语句<br />
&nbsp; * @param parameters<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数<br />
&nbsp; */<br />
&nbsp;public void updateByQuery(final String queryString,<br />
&nbsp;&nbsp; final Object[] parameters);</p>
<p>&nbsp;/**<br />
&nbsp; * 删除一个对象<br />
&nbsp; * <br />
&nbsp; * @param object<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要删除的对象<br />
&nbsp; */<br />
&nbsp;public void delete(Object object);</p>
<p>&nbsp;/**<br />
&nbsp; * 根据类型和对象id删除一个对象<br />
&nbsp; * <br />
&nbsp; * @param clazz<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型<br />
&nbsp; * @param id<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象id<br />
&nbsp; */<br />
&nbsp;public void delete(Class clazz, Serializable id);</p>
<p>&nbsp;/**<br />
&nbsp; * 根据类型删除全部对象<br />
&nbsp; * <br />
&nbsp; * @param clazz<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型<br />
&nbsp; * @return Integer<br />
&nbsp; */<br />
&nbsp;public Integer deleteAll(final Class clazz);</p>
<p>&nbsp;/**<br />
&nbsp; * 根据查询和参数删除全部对象<br />
&nbsp; * <br />
&nbsp; * @param queryString<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询语句<br />
&nbsp; * @param parameters<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数<br />
&nbsp; * @return Integer<br />
&nbsp; */<br />
&nbsp;public Integer deleteByQuery(final String queryString,<br />
&nbsp;&nbsp; final Object[] parameters);</p>
<p>&nbsp;/**<br />
&nbsp; * 获得某个类型的全部对象列表<br />
&nbsp; * <br />
&nbsp; * @param clazz<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型<br />
&nbsp; * @return 对象集合<br />
&nbsp; */<br />
&nbsp;public List findAll(Class clazz);</p>
<p>&nbsp;/**<br />
&nbsp; * 根据类型和对象id载入一个对象<br />
&nbsp; * <br />
&nbsp; * @param clazz<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型<br />
&nbsp; * @param id<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象id<br />
&nbsp; * @return 目标对象<br />
&nbsp; */<br />
&nbsp;public Object load(Class clazz, Serializable id);</p>
<p>&nbsp;/**<br />
&nbsp; * 根据类型和对象id从数据库取得一个对象<br />
&nbsp; * <br />
&nbsp; * @param clazz<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类<br />
&nbsp; * @param id<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象id<br />
&nbsp; * @return 目标对象<br />
&nbsp; */<br />
&nbsp;public Object get(Class clazz, Serializable id);</p>
<p>&nbsp;/**<br />
&nbsp; * 根据查询语句和查询参数从数据库取得一个对象<br />
&nbsp; * <br />
&nbsp; * @param queryString<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询语句<br />
&nbsp; * @param parameters<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数<br />
&nbsp; * @return Object 单个对象<br />
&nbsp; */<br />
&nbsp;public Object get(final String queryString, final Object[] parameters);</p>
<p>&nbsp;/**<br />
&nbsp; * 命名查询<br />
&nbsp; * <br />
&nbsp; * @param queryName<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命名查询语句<br />
&nbsp; * @return 对象列表<br />
&nbsp; */<br />
&nbsp;public List findByNamedQuery(final String queryName);</p>
<p>&nbsp;/**<br />
&nbsp; * 依据单个参数做命名查询<br />
&nbsp; * <br />
&nbsp; * @param query<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命名查询语句<br />
&nbsp; * @param parameter<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单个查询参数<br />
&nbsp; * @return 对象列表<br />
&nbsp; */<br />
&nbsp;public List findByNamedQuery(final String queryString,<br />
&nbsp;&nbsp; final Object parameter);</p>
<p>&nbsp;/**<br />
&nbsp; * 依据参数数组做命名查询<br />
&nbsp; * <br />
&nbsp; * @param query<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命名查询语句<br />
&nbsp; * @param parameters<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询参数数组<br />
&nbsp; * @return 对象列表<br />
&nbsp; */<br />
&nbsp;public List findByNamedQuery(final String queryString,<br />
&nbsp;&nbsp; final Object[] parameters);</p>
<p>&nbsp;/**<br />
&nbsp; * 查询全部<br />
&nbsp; * <br />
&nbsp; * @param query<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询语句<br />
&nbsp; * @return 对象列表<br />
&nbsp; */<br />
&nbsp;public List find(final String queryString);</p>
<p>&nbsp;/**<br />
&nbsp; * 带参数查询全部<br />
&nbsp; * <br />
&nbsp; * @param queryString<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询语句<br />
&nbsp; * @param parameters<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询参数<br />
&nbsp; * @return 对象列表<br />
&nbsp; */<br />
&nbsp;public List find(final String queryString, final Object[] parameters);</p>
<p>&nbsp;/**<br />
&nbsp; * 分页查询<br />
&nbsp; * <br />
&nbsp; * @param queryString<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询语句<br />
&nbsp; * @param parameters<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数<br />
&nbsp; * @param pageInfo<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分页信息<br />
&nbsp; * @return List 对象列表<br />
&nbsp; */<br />
&nbsp;public List findPageByQuery(final String queryString,<br />
&nbsp;&nbsp; final Object[] parameters, final PageInfo pageInfo);</p>
<p>}</p>
<p>以下为Dao的Hibernate3实现</p>
<p>import java.io.*;<br />
import java.util.*;</p>
<p>import org.hibernate.*;<br />
import org.springframework.orm.hibernate3.*;<br />
import org.springframework.orm.hibernate3.support.*;</p>
<p>/**<br />
&nbsp;* 通用DAO的Hibernate实现<br />
&nbsp;* <br />
&nbsp;* @author SunHui<br />
&nbsp;* <br />
&nbsp;*/<br />
public class DaoImpl extends HibernateDaoSupport implements Dao {</p>
<p>&nbsp;public void save(Object object) {<br />
&nbsp; getHibernateTemplate().save(object);<br />
&nbsp;}</p>
<p>&nbsp;public void update(Object object) {<br />
&nbsp; getHibernateTemplate().update(object);<br />
&nbsp;}</p>
<p>&nbsp;public void updateByQuery(final String queryString, final Object[] parameters) {<br />
&nbsp; getHibernateTemplate().execute(new HibernateCallback() {<br />
&nbsp;&nbsp; public Object doInHibernate(Session session) {<br />
&nbsp;&nbsp;&nbsp; Query query = session.createQuery(queryString);<br />
&nbsp;&nbsp;&nbsp; if (parameters != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; parameters.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setParameter(i, parameters[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; query.executeUpdate();<br />
&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp; }<br />
&nbsp; });<br />
&nbsp;}</p>
<p>&nbsp;public void delete(Object object) {<br />
&nbsp; getHibernateTemplate().delete(object);<br />
&nbsp;}</p>
<p>&nbsp;public void delete(Class clazz, Serializable id) {<br />
&nbsp; getHibernateTemplate().delete(load(clazz, id));<br />
&nbsp;}</p>
<p>&nbsp;public Integer deleteAll(final Class clazz) {<br />
&nbsp; return (Integer) getHibernateTemplate().execute(<br />
&nbsp;&nbsp;&nbsp; new HibernateCallback() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object doInHibernate(Session session) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query = session.createQuery("delete "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + clazz.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Integer(query.executeUpdate());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp;}</p>
<p>&nbsp;public List findAll(Class clazz) {<br />
&nbsp; return getHibernateTemplate().find("from " + clazz.getName());<br />
&nbsp;}</p>
<p>&nbsp;public Object load(Class clazz, Serializable id) {<br />
&nbsp; return getHibernateTemplate().load(clazz, id);<br />
&nbsp;}</p>
<p>&nbsp;public Object get(Class clazz, Serializable id) {<br />
&nbsp; return getHibernateTemplate().get(clazz, id);<br />
&nbsp;}</p>
<p>&nbsp;public List findByNamedQuery(final String queryName) {<br />
&nbsp; return getHibernateTemplate().findByNamedQuery(queryName);<br />
&nbsp;}</p>
<p>&nbsp;public List findByNamedQuery(final String queryName, final Object parameter) {<br />
&nbsp; return getHibernateTemplate().findByNamedQuery(queryName, parameter);<br />
&nbsp;}</p>
<p>&nbsp;public List findByNamedQuery(final String queryName, final Object[] parameters) {<br />
&nbsp; return getHibernateTemplate().findByNamedQuery(queryName, parameters);<br />
&nbsp;}</p>
<p>&nbsp;public List find(final String queryString) {<br />
&nbsp; return getHibernateTemplate().find(queryString);<br />
&nbsp;}</p>
<p>&nbsp;public List find(final String queryString, final Object[] parameters) {<br />
&nbsp; return getHibernateTemplate().find(queryString, parameters);<br />
&nbsp;}</p>
<p>&nbsp;public List findPageByQuery(final String queryString, final Object[] parameters,<br />
&nbsp;&nbsp; final PageInfo pageInfo) {<br />
&nbsp; return (List) getHibernateTemplate().execute(new HibernateCallback() {<br />
&nbsp;&nbsp; public Object doInHibernate(Session session)<br />
&nbsp;&nbsp;&nbsp;&nbsp; throws HibernateException {<br />
&nbsp;&nbsp;&nbsp; Query query = session.createQuery(queryString);<br />
&nbsp;&nbsp;&nbsp; if (parameters != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; parameters.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setParameter(i, parameters[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; ScrollableResults sr = query.scroll();<br />
&nbsp;&nbsp;&nbsp; sr.last();<br />
&nbsp;&nbsp;&nbsp; int totalCount = sr.getRowNumber();<br />
&nbsp;&nbsp;&nbsp; int startIndex = (pageInfo.getPageIndex() - 1) * pageInfo.getPageSize();<br />
&nbsp;&nbsp;&nbsp; query.setMaxResults(pageInfo.getPageSize());<br />
&nbsp;&nbsp;&nbsp; query.setFirstResult(startIndex);<br />
&nbsp;&nbsp;&nbsp; int totalRec = totalCount + 1;<br />
&nbsp;&nbsp;&nbsp; pageInfo.setTotalRec(totalRec);<br />
&nbsp;&nbsp;&nbsp; int totalPage = (totalRec % pageInfo.getPageSize() == 0) ? (totalRec / pageInfo.getPageSize())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : (totalRec / pageInfo.getPageSize()) + 1;<br />
&nbsp;&nbsp;&nbsp; int[] pageNumbers = new int[totalPage];<br />
&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; totalPage; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; pageNumbers[i] = (i + 1);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; pageInfo.setPageNumbers(pageNumbers);<br />
&nbsp;&nbsp;&nbsp; pageInfo.setTotalPage(totalPage);<br />
&nbsp;&nbsp;&nbsp; pageInfo.setPageSize(pageInfo.getPageSize());<br />
&nbsp;&nbsp;&nbsp; pageInfo.setPageIndex(pageInfo.getPageIndex());<br />
&nbsp;&nbsp;&nbsp; pageInfo.setPrePage(pageInfo.getPageIndex() - 1);<br />
&nbsp;&nbsp;&nbsp; pageInfo.setNextPage(pageInfo.getPageIndex() + 1);<br />
&nbsp;&nbsp;&nbsp; return query.list();<br />
&nbsp;&nbsp; }<br />
&nbsp; }, true);<br />
&nbsp;}</p>
<p>&nbsp;public Integer deleteByQuery(final String queryString, final Object[] parameters) {<br />
&nbsp; return (Integer) getHibernateTemplate().execute(<br />
&nbsp;&nbsp;&nbsp; new HibernateCallback() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object doInHibernate(Session session) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query = session.createQuery(queryString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parameters != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; parameters.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setParameter(i, parameters[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Integer(query.executeUpdate());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp;}</p>
<p>&nbsp;public Object get(final String queryString, final Object[] parameters) {<br />
&nbsp; List list = getHibernateTemplate().find(queryString, parameters);<br />
&nbsp; if (list != null &amp;&amp; !list.isEmpty()) {<br />
&nbsp;&nbsp; return list.get(0);<br />
&nbsp; }<br />
&nbsp; return null;<br />
&nbsp;}<br />
}</p>
<p><br />
/**<br />
&nbsp;* 通用分页信息类，用于承载分页信息<br />
&nbsp;* <br />
&nbsp;* @author SunHui<br />
&nbsp;* <br />
&nbsp;*/<br />
public class PageInfo {<br />
&nbsp;/**<br />
&nbsp; * 总页数<br />
&nbsp; */<br />
&nbsp;private int totalPage = 1;</p>
<p>&nbsp;/**<br />
&nbsp; * 前一页<br />
&nbsp; */<br />
&nbsp;private int prePage = 1;</p>
<p>&nbsp;/**<br />
&nbsp; * 下一页<br />
&nbsp; */<br />
&nbsp;private int nextPage = 1;</p>
<p>&nbsp;/**<br />
&nbsp; * 总记录数<br />
&nbsp; */<br />
&nbsp;private int totalRec = 0;</p>
<p>&nbsp;/**<br />
&nbsp; * 默认每页记录数<br />
&nbsp; */<br />
&nbsp;private final int defaultPageSize = 10;</p>
<p>&nbsp;/**<br />
&nbsp; * 每页记录数<br />
&nbsp; */<br />
&nbsp;private int pageSize = defaultPageSize;</p>
<p>&nbsp;/**<br />
&nbsp; * 当前页码<br />
&nbsp; */<br />
&nbsp;private int pageIndex = 1;</p>
<p>&nbsp;/**<br />
&nbsp; * 全部页码，从1开始<br />
&nbsp; */<br />
&nbsp;private int[] pageNumbers;</p>
<p>&nbsp;public int getPageIndex() {<br />
&nbsp; return pageIndex;<br />
&nbsp;}</p>
<p>&nbsp;public void setPageIndex(int pageIndex) {<br />
&nbsp; this.pageIndex = pageIndex &gt; 0 ? pageIndex : 1;<br />
&nbsp;}</p>
<p>&nbsp;public int getNextPage() {<br />
&nbsp; return nextPage;<br />
&nbsp;}</p>
<p>&nbsp;public void setNextPage(int nextPage) {<br />
&nbsp; this.nextPage = nextPage &gt; this.totalPage ? this.totalPage : nextPage;<br />
&nbsp;}</p>
<p>&nbsp;public int getPageSize() {<br />
&nbsp; return pageSize;<br />
&nbsp;}</p>
<p>&nbsp;public void setPageSize(int pageSize) {<br />
&nbsp; this.pageSize = pageSize &gt; 0 ? pageSize : 10;<br />
&nbsp;}</p>
<p>&nbsp;public int getPrePage() {<br />
&nbsp; return prePage;<br />
&nbsp;}</p>
<p>&nbsp;public void setPrePage(int prePage) {<br />
&nbsp; this.prePage = prePage &lt; 1 ? 1 : prePage;<br />
&nbsp;}</p>
<p>&nbsp;public int getTotalPage() {<br />
&nbsp; return totalPage;<br />
&nbsp;}</p>
<p>&nbsp;public void setTotalPage(int totalPage) {<br />
&nbsp; this.totalPage = totalPage &gt; 0 ? totalPage : 1;<br />
&nbsp;}</p>
<p>&nbsp;public int getTotalRec() {<br />
&nbsp; return totalRec;<br />
&nbsp;}</p>
<p>&nbsp;public void setTotalRec(int totalRec) {<br />
&nbsp; this.totalRec = totalRec &gt; -1 ? totalRec : 0;<br />
&nbsp;}</p>
<p>&nbsp;public int[] getPageNumbers() {<br />
&nbsp; return pageNumbers;<br />
&nbsp;}</p>
<p>&nbsp;public void setPageNumbers(int[] pageNumbers) {<br />
&nbsp; this.pageNumbers = pageNumbers;<br />
&nbsp;}<br />
}<br />
</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/188464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-03-25 13:06 <a href="http://www.blogjava.net/baoyaer/articles/188464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解spring mvc</title><link>http://www.blogjava.net/baoyaer/articles/186778.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 17 Mar 2008 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/186778.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/186778.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/186778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/186778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/186778.html</trackback:ping><description><![CDATA[<br />
<br />
<img height="216" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/r_springmvc.gif" width="608" border="0" /><br />
<br />
<br />
<br />
注解：<br />
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。<br />
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.<br />
3.DispatcherServlet请请求提交到目标Controller<br />
4.Controller进行业务逻辑处理后，会返回一个ModelAndView<br />
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象<br />
6.视图对象负责渲染返回给客户端 
<img src ="http://www.blogjava.net/baoyaer/aggbug/186778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-03-17 15:36 <a href="http://www.blogjava.net/baoyaer/articles/186778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring的HibernateTemplate的sessio.load()方式如何避免LazyInitializationException </title><link>http://www.blogjava.net/baoyaer/articles/174171.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 10 Jan 2008 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/174171.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/174171.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/174171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/174171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/174171.html</trackback:ping><description><![CDATA[<p>Spring的HibernateTemplate的load()方法，将会使用到Session对象的load方法，这将会使用Hibernate3默认的延迟加载功能，但HibernateTemplate执行完 load方法后，会直接关闭session,因此若此时再尝试去的获取的对象的属性，将会发生LazyInitializationException<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000"><br />
<img id="Codehighlighter1_39_425_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_425_Open_Text.style.display='none'; Codehighlighter1_39_425_Closed_Image.style.display='inline'; Codehighlighter1_39_425_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_39_425_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_39_425_Closed_Text.style.display='none'; Codehighlighter1_39_425_Open_Image.style.display='inline'; Codehighlighter1_39_425_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;User&nbsp;find(</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Integer&nbsp;id)</span><span id="Codehighlighter1_39_425_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_39_425_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_119_417_Open_Image" onclick="this.style.display='none'; Codehighlighter1_119_417_Open_Text.style.display='none'; Codehighlighter1_119_417_Closed_Image.style.display='inline'; Codehighlighter1_119_417_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_119_417_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_119_417_Closed_Text.style.display='none'; Codehighlighter1_119_417_Open_Image.style.display='inline'; Codehighlighter1_119_417_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user</span><span style="color: #000000">=</span><span style="color: #000000">(User)hibernateTemplate.execute(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HibernateCallback()</span><span id="Codehighlighter1_119_417_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_119_417_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_223_402_Open_Image" onclick="this.style.display='none'; Codehighlighter1_223_402_Open_Text.style.display='none'; Codehighlighter1_223_402_Closed_Image.style.display='inline'; Codehighlighter1_223_402_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_223_402_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_223_402_Closed_Text.style.display='none'; Codehighlighter1_223_402_Open_Image.style.display='inline'; Codehighlighter1_223_402_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;HibernateException,SQLException</span><span id="Codehighlighter1_223_402_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_223_402_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user</span><span style="color: #000000">=</span><span style="color: #000000">(User)session,load(User.</span><span style="color: #0000ff">class</span><span style="color: #000000">,id);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate.initialize(user);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reutrn&nbsp;user;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/174171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-10 09:19 <a href="http://www.blogjava.net/baoyaer/articles/174171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 使用BeanPostProcessor实现依赖注入的修正器</title><link>http://www.blogjava.net/baoyaer/articles/174169.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 10 Jan 2008 01:15:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/174169.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/174169.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/174169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/174169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/174169.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>如果我们想对一个bean的所有String类型的属性注入设置一个修正器，使其所有的注入内容均转换成大写，我们可以借助与Spring提供的 BeanPostProcessor接口</p>
<p>首先定义一个类，实现BeanPostProcessor接口，完成注入属性的大小写转换</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_62_676_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_676_Open_Text.style.display='none'; Codehighlighter1_62_676_Closed_Image.style.display='inline'; Codehighlighter1_62_676_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_62_676_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_62_676_Closed_Text.style.display='none'; Codehighlighter1_62_676_Open_Image.style.display='inline'; Codehighlighter1_62_676_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UppercassModifier&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;BeanPostProcessor<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_62_676_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_62_676_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_163_673_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_673_Open_Text.style.display='none'; Codehighlighter1_163_673_Closed_Image.style.display='inline'; Codehighlighter1_163_673_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_163_673_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_163_673_Closed_Text.style.display='none'; Codehighlighter1_163_673_Open_Image.style.display='inline'; Codehighlighter1_163_673_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;postProcessBeforeInitialization(Object&nbsp;bean,String&nbsp;name)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;BeansException<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_163_673_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_163_673_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">取得bean的field成员</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field[]&nbsp;fields</span><span style="color: #000000">=</span><span style="color: #000000">bean.getClass().getDeclaredFields();<br />
<img id="Codehighlighter1_290_648_Open_Image" onclick="this.style.display='none'; Codehighlighter1_290_648_Open_Text.style.display='none'; Codehighlighter1_290_648_Closed_Image.style.display='inline'; Codehighlighter1_290_648_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_290_648_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_290_648_Closed_Text.style.display='none'; Codehighlighter1_290_648_Open_Image.style.display='inline'; Codehighlighter1_290_648_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">fields.lengtj;i</span><span style="color: #000000">++</span><span style="color: #000000">)<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_290_648_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_290_648_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">针对string类型的field成员加以修正</span><span style="color: #008000"><br />
<img id="Codehighlighter1_384_639_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_639_Open_Text.style.display='none'; Codehighlighter1_384_639_Closed_Image.style.display='inline'; Codehighlighter1_384_639_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_384_639_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_384_639_Closed_Text.style.display='none'; Codehighlighter1_384_639_Open_Image.style.display='inline'; Codehighlighter1_384_639_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(fields[i].getType().equals(String.</span><span style="color: #0000ff">class</span><span style="color: #000000">))<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_384_639_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_384_639_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiels[i].setAccessible(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_450_589_Open_Image" onclick="this.style.display='none'; Codehighlighter1_450_589_Open_Text.style.display='none'; Codehighlighter1_450_589_Closed_Image.style.display='inline'; Codehighlighter1_450_589_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_450_589_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_450_589_Closed_Text.style.display='none'; Codehighlighter1_450_589_Open_Image.style.display='inline'; Codehighlighter1_450_589_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_450_589_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_450_589_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;orginal</span><span style="color: #000000">=</span><span style="color: #000000">(String)field[i].get(bean);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field[i].set(bean,orginal.toUpperCase());<br />
<img id="Codehighlighter1_611_627_Open_Image" onclick="this.style.display='none'; Codehighlighter1_611_627_Open_Text.style.display='none'; Codehighlighter1_611_627_Closed_Image.style.display='inline'; Codehighlighter1_611_627_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_611_627_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_611_627_Closed_Text.style.display='none'; Codehighlighter1_611_627_Open_Image.style.display='inline'; Codehighlighter1_611_627_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_611_627_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_611_627_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;bean;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
spring bean<br />
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_25_77_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_77_Open_Text.style.display='none'; Codehighlighter1_25_77_Closed_Image.style.display='inline'; Codehighlighter1_25_77_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_25_77_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_77_Closed_Text.style.display='none'; Codehighlighter1_25_77_Open_Image.style.display='inline'; Codehighlighter1_25_77_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloBean<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_25_77_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_25_77_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;helloworld;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;setter</span><span style="color: #000000">/</span><span style="color: #000000">getter方法<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
&nbsp;</p>
配置文件<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">uppercaseModifier</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">demo.UppercaseModifier</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">helloBean</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">demo.HelloBean</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">helloworld</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/174169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-10 09:15 <a href="http://www.blogjava.net/baoyaer/articles/174169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 整合 Hibernate 的一处简化配置［转］ </title><link>http://www.blogjava.net/baoyaer/articles/166555.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 10 Dec 2007 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166555.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166555.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166555.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">在过去使用 Spring 整合 Hibernate 的时候，都是用这样的配置方式。<br />
<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">bean&nbsp;</span> <span style="color: #ff0000">id</span> <span style="color: #0000ff">="sessionFactory"</span> <span style="color: #ff0000">&nbsp;lazy-init</span> <span style="color: #0000ff">="true"</span> <span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span> <span style="color: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&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">="mappingResources"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&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"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&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">resources/icustomer/Contact.hbm.xml</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&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">resources/icustomer/Customer.hbm.xml</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&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"><br />
&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"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">bean</span> <span style="color: #0000ff">&gt;</span> </div>
<br />
<span style="font-size: 10pt">每当需要加入一个新的 VO 时，我需要过来修改配置文件，来引入对新的 VO 的支持。</span> <br />
<br />
<span style="font-size: 10pt">现在我使用的时候，是这么配的：<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span> <span style="color: #800000">bean&nbsp;</span> <span style="color: #ff0000">id</span> <span style="color: #0000ff">="sessionFactory"</span> <span style="color: #ff0000">&nbsp;lazy-init</span> <span style="color: #0000ff">="true"</span> <span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span> <span style="color: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&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">="mappingLocations"</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&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"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&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">classpath:resources/**/*.hbm.xml</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">value</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&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"><br />
&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"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">bean</span> <span style="color: #0000ff">&gt;</span> </div>
<br />
<span style="font-size: 10pt">做项目开发的时候，就再也没有改过配置。</span> <br />
<br />
&lt;property name="mappingDirectoryLocations"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;list&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;classpath*:domain/mappings/&lt;/value&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/list&gt; <br />
&lt;/property&gt; <br />
还可以使用这种配置
<img src ="http://www.blogjava.net/baoyaer/aggbug/166555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-10 09:05 <a href="http://www.blogjava.net/baoyaer/articles/166555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Spring来创建Observer模式</title><link>http://www.blogjava.net/baoyaer/articles/162370.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 22 Nov 2007 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/162370.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/162370.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/162370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/162370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/162370.html</trackback:ping><description><![CDATA[<div class="postText">转载自TheServerSide网站，介绍使用Spring来创建Observer模式。<br />
<a href="http://www.theserverside.com/articles/article.tss?l=SpringLoadedObserverPattern">http://www.theserverside.com/articles/article.tss?l=SpringLoadedObserverPattern</a><br />
<!--startfragment -->&nbsp;
<p>This article describes an easy process of implementing the observer pattern in the Spring framework (Spring Core). Also discussed in this article are a few of the Spring Core classes as well as an easy way to start the Spring Framework in any project. Finally, this article shows developers and designers that the Spring framework is a great reason to continue design pattern advocacy in your projects.</p>
<p>Recently, it seems when developers use the Spring framework to improve their projects they focus only on simple object oriented design techniques. Unfortunately some of the more brilliantly researched patterns are forgotten in place of a brilliant framework (Spring). Although the Factory Pattern and the Singleton Pattern are built into Spring, other patterns such as the Decorator Pattern, the Adapter Pattern, and the Observer Pattern are often forgotten because of the new ideas Spring has to offer. Fortunately, design patterns and the Spring framework can exist in the same application. In this article I show how the commonly used Observer Pattern fits nicely in the Spring Framework.</p>
<h2>Observer Pattern</h2>
<p>The Observer Pattern is also known as a publisher and subscriber design pattern. The pattern is useful when you have one publisher and many subscribers (one-to-many) that are interested in the publisher's state or messages. Additionally, interested subscribers have the ability to register and unregister as they please. Lastly, subscribers are notified of the publisher's messages automatically (that is, by no effort of their own). Figure 1 is an example of a typical observer pattern.</p>
<h5>Figure 1. Observer Pattern</h5>
<p><img height="307" src="http://www.theserverside.com/articles/content/SpringLoadedObserverPattern/clip_image002.jpg" width="499"  alt="" /><br />
</p>
<p>I chose to use a more widely accepted diagram to describe the Observer Pattern so you will notice that the aforementioned publisher is actually the Subject in this diagram. The subscriber is the Observer in the diagram. The intimate details of the Observer Pattern are far outside of the scope of this article, but a note worthy topic is how the Spring framework can be used to leverage good object oriented design techniques while creating the concrete classes of this pattern.</p>
<p>A normal concreteObserver class is required to have code similar to this constructor (or a similar &#8220;setter&#8221; method to achieve the registering of the Observer with the Subject):</p>
<pre>public concreteObserver(Subject s) {
s.addListener(this);
}
</pre>
<p>Below you will see how the Spring framework wires the two concrete classes together with XML and not with code inside the classes. Ultimately, this allows the developer to avoid any unnecessary coupling of the concrete classes.</p>
<h2>Spring Considerations</h2>
<p>Since this article covers only the most simple implementation of the observer pattern, I utilize only the required Spring framework jars. At a minimum you need to have the spring-core.jar, the spring-context.jar, and the spring-beans.jar from the Spring framework distribution. Also to avoid any run time errors you need the commons-logging.jar from the Apache Commons project in your class path.</p>
<p>Each of these jars provide a specific role that make using the Spring framework possible. First is the spring-core.jar; this jar is required for all Spring applications. It includes Spring's dependency injection classes as well as other classes that are used to create Spring beans. The spring-context.jar contains the ApplicationContext interface. This interface is used to start the Spring framework in my included example project.</p>
<p>The last Spring jar is the spring-beans.jar. It contains the DesposibleBean interface which the FileSystemXmlApplicationContext bean sub-interfaces. I do not directly use the DesposibleBean interface but I use the FileSystemXmlApplicationContext bean to located the XML file used to configure the Spring framework. The code that implements these classes is shown in Listing 6.</p>
<h2>Wiring The Observer Pattern with Spring</h2>
<p>To illustrate the Observer Pattern concretely, I chose to create a Town Crier class that sends messages to any registered Town Resident class. To keep this example simple, I developed the same interfaces shown in Figure 1, but the concrete classes are TownCrier and TownResident. All four of these classes are shown in Listings 1 through 4.</p>
<p>After I created the TownCrier (Listing 3) and two TownResident (Listing 4) classes I created an incomplete version the ObserverContext.xml file (Listing 5). This file contains the Spring definitions of the concrete implementation beans. Since this example is simple, I chose not to use any of the more complex attributes of the bean tag.</p>
<p>Typical Bean tags for the shown classes:</p>
<pre>	&lt;bean id="townCrier" class="springobserver.TownCrier"/&gt;
&lt;bean id="townResident1" class="springobserver.TownResident"/&gt;
&lt;bean id="townResident1" class="springobserver.TownResident2"/&gt;
</pre>
<p>At this point, I was able to run my ExampleRun class (Listing 6), but nothing eventful actually happened. This is because the TownResident classes were not &#8220;wired&#8221; into the TownCrier class.</p>
<p>To perform the wiring of the Observer Pattern I chose to use Spring's MethodInvokingFactoryBean class. This process is a very simple way of calling a method on a class and ultimately passing a parameter into method. In this example, the parameter is the bean definition of a townResident. A snapshot of this bean definition is:</p>
<pre>&lt;bean id="registerTownResident1"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&gt;
&lt;property name="targetObject"&gt;&lt;ref local="townCrier"/&gt;&lt;/property&gt;
&lt;property name="targetMethod"&gt;&lt;value&gt;addListener&lt;/value&gt;&lt;/property&gt;
&lt;property name="arguments"&gt;
&lt;list&gt;
&lt;ref bean="townResident1"/&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
</pre>
<p>As you can see, the targetObject is the townCrier bean, the targetMethod is the addListener method and the argument is the townResident1 bean. This configuration is the only code needed to compose the concrete implementations of the TownCrier with TownResident class.</p>
<p>Now that I have the beans wired together using the MethodInvokingFactoryBean class, I can run my ExampleRun class and see that my TownResident classes are receiving messages from the TownCrier class. Results shown in Example 1.</p>
<h2>Conclusion</h2>
<p>A few lessons learned in this article include a simple way to start the Spring framework, how to use the MethodInvokingFactoryBean, and an efficient implementation the Observer Pattern in the Spring framework. Since this is a minimal approach to the Spring framework, I was able to show the relationship between the ApplicationContext and it's implementation FileSystemXmlApplicationContext class. This process for starting Spring applications is a very easy way to leverage an incredible framework.</p>
<p>Part of this framework is the MethodInvokingFactoryBean. When using it you are free to employ any parameter available to you such as an Integer, a String, or in our case, another Spring bean. By allowing you to expose methods in your context xml files you can be as flexible as you can dream. This article has covered the addListener() method of the Observer Pattern. I would like to extend a challenge to you to figure out how to implement the removeListener() method using strictly the Spring framework.</p>
<p>Lastly, the Observer Pattern is a common and very useful pattern. The practices shown in this article provide an example of how the concrete implementation of the Observer interface can be developed with no additional coupling to the concrete implementation of the Subject interface. This feature of Spring encourages good object oriented design techniques. As a final note, there is really no reason developers and designers can not find ways to marry proven design patterns with beautifully developed frameworks.</p>
<h5>Listing 1. The Observer Interface</h5>
<pre>package springobserver;
public interface Observer {
public void update(String messageText);
}
</pre>
<h5>Listing 2. The Subject Interface</h5>
<pre>package springobserver;
public interface Subject {
public void addListener(Observer o);
public void removeListener(Observer o);
public void notifyListeners();
}
</pre>
<h5>Listing 3. The Town Crier</h5>
<pre>package springobserver;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TownCrier implements Subject {
private List townResident = new ArrayList();
private String messageText;
// this message is added so I can give
// this class a reason to call notifyListener.
public void setMessage(String message){
System.out.println("I'm the Town Crier and " +
"I've got a message: " + message);
this.messageText = message;
this.notifyListeners();
}
public void addListener(Observer o) {
this.townResident.add(o);
}
public void removeListener(Observer o) {
if (this.townResident.contains(o)){
this.townResident.remove(o);
}
}
// call the update method on
// each observer (town resident)
public void notifyListeners() {
for (Iterator iter = townResident.iterator(); iter.hasNext();) {
Observer listener = (Observer) iter.next();
listener.update(messageText);
}
}
}
</pre>
<h5>Listing 4. The Town Residents</h5>
<pre>package springobserver;
public class TownResident implements Observer {
public void update(String messageText) {
System.out.println("Greetings my name is: " + this);
System.out.println("I heard: " + messageText);
}
-------- new class --------
package springobserver;
public class TownResident2 implements Observer {
public void update(String messageText) {
System.out.println("Greetings my name is: " + this);
System.out.println("I heard: " + messageText);
}
}</pre>
<h5>Listing 5. The Application Context XML (ObserverContext.xml)</h5>
<!-- 6 -->
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"&gt;
&lt;beans&gt;
&lt;!-- This bean is the town crier.
He's responsible for notifying all town residents that are interested in his message --&gt;
&lt;bean id="townCrier" class="springobserver.TownCrier"/&gt;
&lt;!-- this bean is a town resident interested in the town criers messages --&gt;
&lt;bean id="townResident1" class="springobserver.TownResident"/&gt;
&lt;!-- this bean is another town resident interested in the town criers messages --&gt;
&lt;bean id="townResident2" class="springobserver.TownResident2"/&gt;
&lt;!-- this is a method invoking bean that registers the first town resident with
with the town crier --&gt;
&lt;bean id="registerTownResident1"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&gt;
&lt;property name="targetObject"&gt;&lt;ref local="townCrier"/&gt;&lt;/property&gt;
&lt;property name="targetMethod"&gt;&lt;value&gt;addListener&lt;/value&gt;&lt;/property&gt;
&lt;property name="arguments"&gt;
&lt;list&gt;
&lt;ref bean="townResident1"/&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;!-- this is a method invoking bean that registers the second town
resident with the town crier --&gt;
&lt;bean id="registerTownResident2"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&gt;
&lt;property name="targetObject"&gt;&lt;ref local="townCrier"/&gt;&lt;/property&gt;
&lt;property name="targetMethod"&gt;&lt;value&gt;addListener&lt;/value&gt;&lt;/property&gt;
&lt;property name="arguments"&gt;
&lt;list&gt;
&lt;ref bean="townResident2"/&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;/beans&gt;
</pre>
<!-- 7 -->
<h5>Listing 6. Example Run</h5>
<pre>package springobserver;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class ExampleRun {
public static void main(String[] args) {
// launch the spring frame work.
ApplicationContext ctx = new FileSystemXmlApplicationContext(
"/config/ObserverContext.xml");
// grab the Town Crier out of the spring
// framework and send a message too all observers
TownCrier crier = (TownCrier) ctx.getBean("townCrier");
crier.setMessage("It is 1 O'Clock and all is well!");
}
}
</pre>
<h5>Example 1. System Output</h5>
<pre>I'm the Town Crier and I've got a message: It is 1 O'Clock and all is well!
Greetings my name is: springobserver.TownResident@80fa6f
I heard: It is 1 O'Clock and all is well!
Greetings my name is: springobserver.TownResident2@1b9ce4b
I heard: It is 1 O'Clock and all is well!
</pre>
<p><a href="http://www.springframework.org/"></a></p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/162370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-11-22 14:17 <a href="http://www.blogjava.net/baoyaer/articles/162370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 1.x中AOP的使用 </title><link>http://www.blogjava.net/baoyaer/articles/162078.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 21 Nov 2007 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/162078.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/162078.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/162078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/162078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/162078.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 本文通过一个&#8220;Hello World&#8221;级别的横切性功能介绍Spring1.X中AOP的使用，并结合Spring的经典的声明式事务管理给出Spring AOP配置中的经典方案。在Spring2出来以后，Spring1.X的AOP使用方式已经&#8220;不合时宜&#8221;了，因此如果你是在新项目中...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/162078.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/162078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-11-21 14:10 <a href="http://www.blogjava.net/baoyaer/articles/162078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring使用JdbcTemplate操作数据库</title><link>http://www.blogjava.net/baoyaer/articles/154080.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 19 Oct 2007 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/154080.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/154080.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/154080.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/154080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/154080.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首先，假设如下SQL表中有数据username=test1,passwd=test1,address=test1CREATE TABLE `login` (&nbsp; `username` varchar(10) default NULL,&nbsp; `passwd` varchar(10) default NULL,&nbsp; `address` varchar(10) d...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/154080.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/154080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-19 09:19 <a href="http://www.blogjava.net/baoyaer/articles/154080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdbcTemplate总结</title><link>http://www.blogjava.net/baoyaer/articles/153909.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 18 Oct 2007 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/153909.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/153909.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/153909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/153909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/153909.html</trackback:ping><description><![CDATA[<p>1.您可以使用JdbcTemplate的execute()方法執行SQL DDL语句，例如：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">jdbcTemplate.execute(</span><span style="color: #000000">"</span><span style="color: #000000">CREATE&nbsp;TABLE&nbsp;USER&nbsp;(user_id&nbsp;integer,&nbsp;name&nbsp;varchar(100))</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<p><br />
使用JdbcTemplate进行查询时，可以使用queryForXXX()等方法，例如使用queryForInt()方法传回user表格中的数据数目： jdbcTemplate.quertForInt("select count(*) from user"); 也可以使用queryForObject()传回一个查询后的对象，例如传回一个String对象：</p>
<p>String name=(String)jdbcTemplate.queryForObject(<br />
　　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "selcet name from user where id=?",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Object[]{id},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.lang.String.class);<br />
)<br />
</p>
<p><br />
单独查询某个数据并赋值给特定对象时：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_44_1017_Open_Image" onclick="this.style.display='none'; Codehighlighter1_44_1017_Open_Text.style.display='none'; Codehighlighter1_44_1017_Closed_Image.style.display='inline'; Codehighlighter1_44_1017_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_44_1017_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_44_1017_Closed_Text.style.display='none'; Codehighlighter1_44_1017_Open_Image.style.display='inline'; Codehighlighter1_44_1017_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;BaseObj&nbsp;getBaseObj(</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ID)&nbsp;</span><span id="Codehighlighter1_44_1017_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_44_1017_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;*&nbsp;from&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;DB_TABLE_NAME&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;where&nbsp;NewsId=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;ID;<br />
<img id="Codehighlighter1_209_989_Open_Image" onclick="this.style.display='none'; Codehighlighter1_209_989_Open_Text.style.display='none'; Codehighlighter1_209_989_Closed_Image.style.display='inline'; Codehighlighter1_209_989_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_209_989_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_209_989_Closed_Text.style.display='none'; Codehighlighter1_209_989_Open_Image.style.display='inline'; Codehighlighter1_209_989_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BaseObj&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">(BaseObj)&nbsp;getJdbcTemplate().query(sql,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ResultSetExtractor()</span><span id="Codehighlighter1_209_989_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_209_989_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_303_979_Open_Image" onclick="this.style.display='none'; Codehighlighter1_303_979_Open_Text.style.display='none'; Codehighlighter1_303_979_Closed_Image.style.display='inline'; Codehighlighter1_303_979_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_303_979_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_303_979_Closed_Text.style.display='none'; Codehighlighter1_303_979_Open_Image.style.display='inline'; Codehighlighter1_303_979_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;extractData(ResultSet&nbsp;rs)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException,DataAccessException&nbsp;</span><span id="Codehighlighter1_303_979_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_303_979_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_336_936_Open_Image" onclick="this.style.display='none'; Codehighlighter1_336_936_Open_Text.style.display='none'; Codehighlighter1_336_936_Closed_Image.style.display='inline'; Codehighlighter1_336_936_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_336_936_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_336_936_Closed_Text.style.display='none'; Codehighlighter1_336_936_Open_Image.style.display='inline'; Codehighlighter1_336_936_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rs.next())&nbsp;</span><span id="Codehighlighter1_336_936_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_336_936_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewsObj&nbsp;news&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;NewsObj();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setID(rs.getInt(</span><span style="color: #000000">"</span><span style="color: #000000">NewsID</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setTitle(rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">NewsTitle</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setBigClass(rs.getInt(</span><span style="color: #000000">"</span><span style="color: #000000">BigClassId</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setNewsContent(rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">NewsContent</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setNewsKey(rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">NewsKey</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setNewsAuthor(rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">NewsAuthor</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setImg(rs.getBoolean(</span><span style="color: #000000">"</span><span style="color: #000000">isImg</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setNewsFrom(rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">NewsFrom</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;news;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;obj;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>&nbsp;</p>
<p>上面两个例子都是传回单独一笔数据，如果要传回多笔数据，则可以使用queryForList()方法，例如：<br />
List rows=jdbcTemplate().queryForList("select * from user where id="+id.intValue()); 传回的list中包括的是map对象，每个map对象代表查询结果中的一笔数据，每笔数据包括多个字段，要取得字段中的值，就要使用字段名作为key,例如：</p>
<p>&nbsp;&nbsp; Iterator it=rows.iterator();<br />
&nbsp;&nbsp; while(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map result=(Map)it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(userMap.get("id"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(userMap.get("name"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(userMap.get("age"));<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>在查询的同时，你可以在返回结果之前先进行一些处理，这就要实现RowCallbackHandler接口</p>
<p>public User find(Integer id){<br />
&nbsp;&nbsp; final User user=new User();<br />
&nbsp;&nbsp; jdbcTemplate.query("select * from user where id=?",new Object[]{id},<br />
&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; new RowCallBackHandler(){<br />
&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; public void proccessRow(ResultSet rs){ <br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setId(new Integer(rs.getInt("id")));<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uset.setName(rs.getString("name"));&nbsp;&nbsp;&nbsp;&nbsp;<br />
&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; }<br />
&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;});<br />
&nbsp;&nbsp; return user;<br />
&nbsp;}</p>
<p>如果一次要返回多个查询结果对象，则可以实现RowMapper接口</p>
<p>public class UserRowMapper implements RowMapper{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object MapRow(ResultSet rsmint rowNum) throws SQLException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user=new User();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setId(new Integer(rs.getInt("id")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setName(rs.getString("name"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
}</p>
<p>使用RowMapper查询单笔数据</p>
<p>public User find(Integer id){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user=(User)jdbcTemplate.queryForObject("select * from user where id=?",new Object[]{id},<br />
&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;&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; new UserRowMapper());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return user;</p>
<p>}</p>
<p>使用RowMapper查询多笔数据</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_41_339_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_339_Open_Text.style.display='none'; Codehighlighter1_41_339_Closed_Image.style.display='inline'; Codehighlighter1_41_339_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_41_339_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_41_339_Closed_Text.style.display='none'; Codehighlighter1_41_339_Open_Image.style.display='inline'; Codehighlighter1_41_339_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UserRowMapper&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;RowMapper&nbsp;</span><span id="Codehighlighter1_41_339_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_41_339_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;mapRow(ResultSet&nbsp;rs,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;index)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_127_332_Open_Image" onclick="this.style.display='none'; Codehighlighter1_127_332_Open_Text.style.display='none'; Codehighlighter1_127_332_Closed_Image.style.display='inline'; Codehighlighter1_127_332_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_127_332_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_127_332_Closed_Text.style.display='none'; Codehighlighter1_127_332_Open_Image.style.display='inline'; Codehighlighter1_127_332_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_127_332_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_127_332_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;u&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;User();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.setId(rs.getString(&#8221;ID&#8221;));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.setName(rs.getString(&#8221;Name&#8221;));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.setPassword(rs.getString(&#8221;Password&#8221;));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;u;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List&nbsp;select(String&nbsp;where)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_380_582_Open_Image" onclick="this.style.display='none'; Codehighlighter1_380_582_Open_Text.style.display='none'; Codehighlighter1_380_582_Closed_Image.style.display='inline'; Codehighlighter1_380_582_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_380_582_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_380_582_Closed_Text.style.display='none'; Codehighlighter1_380_582_Open_Image.style.display='inline'; Codehighlighter1_380_582_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_380_582_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_380_582_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&#8220;select&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;from&nbsp;admin&nbsp;&#8220;</span><span style="color: #000000">+</span><span style="color: #000000">where;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;jdbcTemplate.query(sql,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;RowMapperResultReader(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;UserRowMapper()));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;list;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>&nbsp;</p>
<p>传回的users对象中，包括了从数据库查询出来的结果，并已经封装成uer对象<br />
<br />
还可以参阅下面链接：<br />
</p>
<a title="jdbctemplate 语句" href="http://www.javaeye.com/topic/53526">jdbctemplate 语句</a>
<img src ="http://www.blogjava.net/baoyaer/aggbug/153909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-18 15:32 <a href="http://www.blogjava.net/baoyaer/articles/153909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用spring-mock进行dao集成测试</title><link>http://www.blogjava.net/baoyaer/articles/131485.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 20 Jul 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/131485.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/131485.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/131485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/131485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/131485.html</trackback:ping><description><![CDATA[在进行dao的集成测试时候，数据清理，察看数据都是比较麻烦的事情，使用Spring-mock.jar可以帮助我们简化着一个过程。我举一个简单的例子，说明一下如何使用spring-mock。 <br><br>首先是po, hbm.xml, dao, daoimpl没什么好说的： <br>
<table style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
    <tbody>
        <tr>
            <td bgColor=#eeeeee><font face="Courier New"><br>Customer.java : <br><br>package rst.spring.mock; <br><br>import java.io.Serializable; <br><br>/** @author Hibernate CodeGenerator */ <br>public class Customer implements Serializable { <br><br>&nbsp;&nbsp;&nbsp;/** identifier field */ <br>&nbsp;&nbsp;&nbsp;private Long id; <br><br>&nbsp;&nbsp;&nbsp;/** nullable persistent field */ <br>&nbsp;&nbsp;&nbsp;private String name; <br><br>&nbsp;&nbsp;&nbsp;/** full constructor */ <br>&nbsp;&nbsp;&nbsp;public Customer(String name) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name; <br>&nbsp;&nbsp;&nbsp;} <br><br>&nbsp;&nbsp;&nbsp;/** default constructor */ <br>&nbsp;&nbsp;&nbsp;public Customer() { <br>&nbsp;&nbsp;&nbsp;} <br><br>&nbsp;&nbsp;&nbsp;public Long getId() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this.id; <br>&nbsp;&nbsp;&nbsp;} <br><br>&nbsp;&nbsp;&nbsp;public void setId(Long id) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.id = id; <br>&nbsp;&nbsp;&nbsp;} <br><br>&nbsp;&nbsp;&nbsp;public String getName() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this.name; <br>&nbsp;&nbsp;&nbsp;} <br><br>&nbsp;&nbsp;&nbsp;public void setName(String name) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name; <br>&nbsp;&nbsp;&nbsp;} <br><br>} <br><br>Customer.hbm.xml : <br><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br>&lt;!DOCTYPE hibernate-mapping PUBLIC <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"-//Hibernate/Hibernate Mapping DTD//EN" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"&gt; <br>&lt;hibernate-mapping package="rst.spring.mock"&gt; <br>&lt;class name="Customer" table="customer"&gt; <br>&lt;id name="id" column="id" type="long" unsaved-value="null"&gt; <br>&lt;generator class="identity"/&gt; <br>&lt;/id&gt; <br>&lt;property name="name" column="name" type="string"/&gt; <br>&lt;/class&gt; <br><br>&lt;/hibernate-mapping&gt; <br><br>CustomerDAO : <br>/* <br>* Created on 2005-3-25 <br>*/ <br>package rst.spring.mock; <br><br>import org.springframework.dao.DataAccessException; <br><br>/** <br>* @author rst <br>* <br>*/ <br>public interface CustomerDAO { <br>&nbsp;&nbsp;&nbsp;public void add(Customer customer) throws DataAccessException; <br>} <br><br>CustomerDAOImpl : <br><br>package rst.spring.mock; <br><br>import org.springframework.dao.DataAccessException; <br>import org.springframework.orm.hibernate.support.HibernateDaoSupport; <br><br>/** <br>* Class description. <br>* <br>* @author rst <br>*/ <br>public class CustomerDAOHibernateImpl extends HibernateDaoSupport implements CustomerDAO{ <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;public void add(Customer customer) throws DataAccessException{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.getHibernateTemplate().save(customer); <br>&nbsp;&nbsp;&nbsp;} <br>} <br><br></font></td>
        </tr>
    </tbody>
</table>
<br><br>然后测试的基类SpringDAOTestCase继承自AbstractTransactionalDataSourceSpringContextTests，目前只有一个指定测试用xml文件位置的逻辑。 <br>
<table style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
    <tbody>
        <tr>
            <td bgColor=#eeeeee><font face="Courier New"><br>package rst.spring.mock; <br><br>import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests; <br><br>/** <br>* Class description. <br>* <br>* @author rst <br>*/ <br>public abstract class SpringDAOTestCase extends AbstractTransactionalDataSourceSpringContextTests { <br><br>&nbsp;protected String[] getConfigLocations() { <br>&nbsp;&nbsp;&nbsp;return new String[] { "test.xml" }; <br>&nbsp;} <br><br>} <br></font></td>
        </tr>
    </tbody>
</table>
<br><br>接着是我们真正测试的类CustomerDAOTest.java： <br>
<table style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
    <tbody>
        <tr>
            <td bgColor=#eeeeee><font face="Courier New"><br>package rst.spring.mock; <br><br>/** <br>* Class description. <br>* <br>* @author rst <br>*/ <br>public class CustomerDaoTest extends SpringDAOTestCase { <br><br>&nbsp;&nbsp;&nbsp;private CustomerDAOHibernateImpl customerDAO; <br><br>&nbsp;&nbsp;&nbsp;protected void onSetUpInTransaction() throws Exception { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onSetUpInTransaction(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//this.setPopulateProtectedVariables(true); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customerDAO = (CustomerDAOHibernateImpl) this.applicationContext.getBean("customerDAO"); <br>&nbsp;&nbsp;&nbsp;} <br><br>&nbsp;&nbsp;&nbsp;protected void onTearDownInTransaction() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customerDAO = null; <br>&nbsp;&nbsp;&nbsp;} <br><br>&nbsp;&nbsp;&nbsp;public void testInsert() { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer customer = new Customer(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setName("javaeye"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customerDAO.add(customer); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name = (String) jdbcTemplate.queryForObject("select name from customer where id=?", new Object[]{customer.getId()}, String.class); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(customer.getName(), name); <br>&nbsp;&nbsp;&nbsp;} <br><br>} <br></font></td>
        </tr>
    </tbody>
</table>
<br><br>最后看看配置文件test.xml： <br>
<table style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
    <tbody>
        <tr>
            <td bgColor=#eeeeee><font face="Courier New"><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br>&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br><br>&lt;!-- <br>&nbsp;- Application context definition for Petclinic on Hibernate. <br>--&gt; <br>&lt;beans&gt; <br><br>&lt;!-- ========================= RESOURCE DEFINITIONS ========================= --&gt; <br>&nbsp; <br>&lt;!-- Configurer that replaces ${...} placeholders with values from a properties file --&gt; <br>&lt;!-- (in this case, JDBC-related settings for the dataSource definition below) --&gt; <br>&lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt; <br>&lt;property name="location"&gt;&lt;value&gt;classpath:jdbc.properties&lt;/value&gt;&lt;/property&gt; <br>&lt;/bean&gt; <br><br>&lt;!-- Local DataSource that works in any environment --&gt; <br>&lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt; <br>&lt;property name="driverClassName"&gt;&lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;&lt;/property&gt; <br>&lt;property name="url"&gt;&lt;value&gt;${jdbc.url}&lt;/value&gt;&lt;/property&gt; <br>&lt;property name="username"&gt;&lt;value&gt;${jdbc.username}&lt;/value&gt;&lt;/property&gt; <br>&lt;property name="password"&gt;&lt;value&gt;${jdbc.password}&lt;/value&gt;&lt;/property&gt; <br>&lt;/bean&gt; <br><br>&lt;!-- Hibernate SessionFactory --&gt; <br>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt; <br>&lt;property name="dataSource"&gt;&lt;ref local="dataSource"/&gt;&lt;/property&gt; <br>&lt;property name="mappingResources"&gt; <br>&lt;value&gt;rst/spring/mock/Customer.hbm.xml&lt;/value&gt; <br>&lt;/property&gt; <br>&lt;property name="hibernateProperties"&gt; <br>&lt;props&gt; <br>&lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt; <br>&lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt; <br>&lt;/props&gt; <br>&lt;/property&gt; <br>&lt;/bean&gt; <br><br>&lt;!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --&gt; <br>&lt;bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt; <br>&lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory"/&gt;&lt;/property&gt; <br>&lt;/bean&gt; <br><br>&lt;bean id="hibernateTemplate" class="org.springframework.orm.hibernate.HibernateTemplate"&gt; <br>&lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory"/&gt;&lt;/property&gt; <br>&lt;/bean&gt; <br><br>&lt;bean id="customerDAO" class="rst.spring.mock.CustomerDAOHibernateImpl"&gt; <br>&lt;property name="hibernateTemplate"&gt;&lt;ref local="hibernateTemplate"/&gt;&lt;/property&gt; <br>&lt;/bean&gt; <br>&lt;/beans&gt; <br></font></td>
        </tr>
    </tbody>
</table>
<br>这个文件很简单，不要忘记transactionManager的配置，Test类会自动装配的。 <br><br>运行之后，就可以看到应有的结果，并且数据库中不会有数据污染。这个过程主要是开始一个transaction，然后开始你的test方法，执行dao操作，执行sql查询验证结果，最后无论成功失败rollback transaction。
<img src ="http://www.blogjava.net/baoyaer/aggbug/131485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-20 14:55 <a href="http://www.blogjava.net/baoyaer/articles/131485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在基于Spring及Hibernate应用程序中使用ETags降低带宽占用和服务器压力</title><link>http://www.blogjava.net/baoyaer/articles/130470.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 16 Jul 2007 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/130470.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/130470.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/130470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/130470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/130470.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 导言REST方式的应用程序构架在近日所产生的巨大影响突出了Web应用程序的优雅设计的重要性。现在人们开始理解&#8220;WWW架构&#8221;内在的可测量性及弹性，并且已经开始探索使用其范例的更好的方式。在本文中，我们将讨论一个Web应用开发工具——&#8220;简陋的、卑下的&#8221;ETags，以及如何在基于SpringFramework的动态Web应用程序中集成这个工具，来提高应...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/130470.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/130470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-16 09:02 <a href="http://www.blogjava.net/baoyaer/articles/130470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring+AOP+osCache </title><link>http://www.blogjava.net/baoyaer/articles/127078.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 29 Jun 2007 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/127078.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/127078.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/127078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/127078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/127078.html</trackback:ping><description><![CDATA[<h2>Introduction</h2>
<p>by:http://opensource.atlassian.com/confluence/spring/display/DISC/AOP+Cache</p>
<p>I've written an <span class=nobr><a title="Visit page outside Confluence" href="http://www.onthoo.com/blog/programming/2004/09/spring-aop-cache.html" rel=nofollow><u><font color=#0000ff>AOP interceptor<sup><img class=rendericon height=7 alt="" src="http://opensource.atlassian.com/confluence/spring/images/icons/linkext7.gif" width=7 align=absMiddle border=0></sup></font></u></a></span> which allows you to specify which methods to cache for Spring beans.<br>Different cache providers are available: Memory HashMap, EHCache, OSCache (which is clusterable) and SwarmCache.</p>
<h3><a name=AOPCache-Example></a>Example</h3>
<p>We start by defining a bookManager object which has one method<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;List&nbsp;getRelated(Book);</span> </div>
<p>&nbsp;</p>
<div class=code>
<div class=codeContent>
<pre class=code-java>which returns a List of Books that are related to the Book that is specified. This method is ideally suited for caching, since the related books will not change that often.<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="bookManager"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="com.example.BookManager"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
</pre>
</div>
</div>
<p>Next we define the AOP interceptor which will cache the results. This example will return a cached result (the List of Books) instead of a call to bookManager.getRelated(Book), if the method is called with the same Book argument.</p>
<p>Available implementations of CacheInterceptor are:</p>
<ul>
    <li>MemoryCacheInterceptor: a simple in-memory cache that's not meant for production
    <li>EHCacheInterceptor: uses EHCache from Hibernate and should be configured in ehcache.xml as described in the EHCache documentation.
    <li>SwarmCacheInterceptor: a clusterable cache implementation
    <li>OSCacheInterceptor: uses OSCache from OpenSymphony and is the one used in this example </li>
</ul>
<p>The cache in the example is expired after 15 minutes.&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">bean&nbsp;</span> <span style="COLOR: #ff0000">id</span> <span style="COLOR: #0000ff">="cacheInterceptor"</span> <span style="COLOR: #ff0000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class</span> <span style="COLOR: #0000ff">="org.springframework.aop.interceptor.cache.OSCacheInterceptor"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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">="refreshPeriods"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">props</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">&lt;!--</span> <span style="COLOR: #008000">&nbsp;Cache&nbsp;the&nbsp;returned&nbsp;related&nbsp;books&nbsp;for&nbsp;15&nbsp;minutes&nbsp;</span> <span style="COLOR: #008000">--&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">prop&nbsp;</span> <span style="COLOR: #ff0000">key</span> <span style="COLOR: #0000ff">="com.example.BookManager@getRelated"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">900</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">prop</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">props</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">&lt;!--</span> <span style="COLOR: #008000">&nbsp;For&nbsp;caches&nbsp;not&nbsp;defined&nbsp;under&nbsp;'refreshPeriods',&nbsp;use&nbsp;this&nbsp;value&nbsp;</span> <span style="COLOR: #008000">--&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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">="defaultRefreshPeriod"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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">-1</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">value</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">&lt;!--</span> <span style="COLOR: #008000">&nbsp;Which&nbsp;method&nbsp;to&nbsp;call&nbsp;for&nbsp;non-standard&nbsp;objects&nbsp;like&nbsp;String,&nbsp;Boolean&nbsp;or&nbsp;Number.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;This&nbsp;method&nbsp;should&nbsp;be&nbsp;a&nbsp;simple&nbsp;method,&nbsp;like&nbsp;getId()&nbsp;or&nbsp;toString(),&nbsp;but&nbsp;should<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;uniquely&nbsp;identify&nbsp;the&nbsp;object.&nbsp;</span> <span style="COLOR: #008000">--&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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">="identifiers"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">props</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">&lt;!--</span> <span style="COLOR: #008000">&nbsp;If&nbsp;a&nbsp;method&nbsp;contains&nbsp;an&nbsp;argument&nbsp;com.example.Book,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;generated&nbsp;cache&nbsp;key&nbsp;contains&nbsp;the&nbsp;value&nbsp;of&nbsp;Book.getId()&nbsp;</span> <span style="COLOR: #008000">--&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">prop&nbsp;</span> <span style="COLOR: #ff0000">key</span> <span style="COLOR: #0000ff">="com.example.Book"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">getId</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">prop</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">props</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">bean</span> <span style="COLOR: #0000ff">&gt;</span> </div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><em>refreshPeriods</em> and <em>defaultRefreshPeriod</em> are properties that are specific for the OSCacheInterceptor. The best way to know how to configure a specific CacheInterceptor implementation is by having a look in the Javadoc (see the project.zip file).</p>
<p><em>refreshPeriods</em> indicates how long the results will be cached in seconds. So a call to com.example.BookManager.getRelated() will be cached for 900 seconds (15 minutes).<br>When a method is intercepted that is not defined under <em>refreshPeriods</em>, the value of <em>defaultRefreshPeriod</em> will be used.</p>
<p>In order to be able to identify a call to the method with the same parameter, we use the <em>identifiers</em> property. Here you can list the function that needs to be called in order to get a unique identifier for this class. For each class that is used as an argument for the cached methods, specify the method name (which may not have any parameters). This is a better aproach than using the toString() method, since this method can produce long lines while most of the time a simple identifier is available. So in this example, book.getId() will be used to identify separate Book arguments. There is no need to specify arguments that are primitives (float, int), Strings or Numbers (Float, Integer, ...).</p>
<p>Now we wire the cacheInterceptor to the bookManager bean and we're done! Calls to bookManager.getRelated() will from now on be cached for 15 minutes.<br>Of course you can add as many beans to the cache as you want.<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #008000">&lt;!--</span> <span style="COLOR: #008000">&nbsp;An&nbsp;advisor&nbsp;that&nbsp;wraps&nbsp;bookManager.getRelated()&nbsp;with&nbsp;the&nbsp;cacheInterceptor&nbsp;</span> <span style="COLOR: #008000">--&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">bean&nbsp;</span> <span style="COLOR: #ff0000">id</span> <span style="COLOR: #0000ff">="bookManagerAdvisor"</span> <span style="COLOR: #ff0000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class</span> <span style="COLOR: #0000ff">="org.springframework.aop.support.RegexpMethodPointcutAdvisor"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">ref&nbsp;</span> <span style="COLOR: #ff0000">bean</span> <span style="COLOR: #0000ff">="cacheInterceptor"</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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">="patterns"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&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">.*getRelated</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">value</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">bean</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">bean&nbsp;</span> <span style="COLOR: #ff0000">id</span> <span style="COLOR: #0000ff">="bookManagerCacheProxyCreator"</span> <span style="COLOR: #ff0000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class</span> <span style="COLOR: #0000ff">="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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">="beanNames"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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">bookManager</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">value</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&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">bookManagerAdvisor</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">value</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">bean</span> <span style="COLOR: #0000ff">&gt;</span> </div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/127078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-06-29 15:08 <a href="http://www.blogjava.net/baoyaer/articles/127078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用 Spring 和 EHCache 缓存结果（翻译） [zt]</title><link>http://www.blogjava.net/baoyaer/articles/126847.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 28 Jun 2007 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/126847.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/126847.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/126847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/126847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/126847.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 导言从 Spring 1.1.1 开始，EHCache 就作为一种通用缓存解决方案集成进 Spring。我将示范拦截器的例子，它能把方法返回的结果缓存起来。&nbsp;利用 Spring IoC 配置 EHCache在 Spring 里配置 EHCache 很简单。你只需一个 ehcache.xml 文件，该文件用于配置 EHCache：&nbsp; &lt; ehcache ...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/126847.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/126847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-06-28 16:23 <a href="http://www.blogjava.net/baoyaer/articles/126847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring IOC容器实现探讨 </title><link>http://www.blogjava.net/baoyaer/articles/113251.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 24 Apr 2007 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/113251.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/113251.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/113251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/113251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/113251.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; spring IOC容器的实现，一开始我被复杂的接口和类所掩埋，看不清整体的思路和设计，踟蹰于代码丛林中，摸不清前进的方向。一开始我就决定只研读以xml文件做配置文件的XmlFactoryBean的具体实现为主要目标，渐渐地有了点感觉，用UML把spring中的bean工厂体系展现出来之后就更清晰了，让你不得不感叹设计的精巧和复杂。本文只是我个人对spring IOC实现的理解，如有...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/113251.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/113251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-04-24 16:48 <a href="http://www.blogjava.net/baoyaer/articles/113251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring ProxyFactoryBean 是如何实现所有的AOP proxy都有可能转为Advised接口的？</title><link>http://www.blogjava.net/baoyaer/articles/102410.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 07 Mar 2007 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/102410.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/102410.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/102410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/102410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/102410.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1												、														ProxyFactoryBean 												把														proxy												的创建交给														AopProxy												去做。																															...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/102410.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/102410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-03-07 15:14 <a href="http://www.blogjava.net/baoyaer/articles/102410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 事务代码分析</title><link>http://www.blogjava.net/baoyaer/articles/93851.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 15 Jan 2007 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/93851.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/93851.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/93851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/93851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/93851.html</trackback:ping><description><![CDATA[
		<div>
				<font size="2">实际上,在spring的事务中,只要该类被设置为了事务代理:</font>
		</div>
		<div>
				<font color="#000080" size="2">
				</font> </div>
		<div>
				<font color="#000080" size="2">拦截器都会创建一个Trans<font color="#008000">actionInfo </font>对象:</font>
		</div>
		<div>
				<font color="#000080" size="2">
				</font> </div>
		<div>
				<font size="2">
						<font color="#000080">Trans<font color="#008000">actionInfo txInfo = new TransactionInfo(txAttr, method);</font></font>
				</font>
		</div>
		<div> </div>
		<div>
				<font color="#000080" size="2">
				</font> </div>
		<div>
				<font color="#000080">
						<font size="2">而且如果</font>
						<font size="2">只要被调用的方法设置了事务属性(<font color="#008000">txAttr</font>),不管是什么属性都会调用:</font>
				</font>
		</div>
		<div>
				<font color="#000080" size="2">
				</font> </div>
		<div>
				<font color="#008000" size="2">txInfo.newTransactionStatus(this.transactionManager.getTransaction(txAttr));</font>
		</div>
		<div>
				<font color="#000080" size="2">
				</font> </div>
		<div>
				<font color="#000080" size="2">根据该方法的事务属性(definition )的不同,this.transactionManager.getTransaction(txAttr)的返回值会有所不同(代码见AbstractPlatformTransactionManager),具体为以下几种情况:</font>
		</div>
		<div>
				<font color="#000080" size="2">1.当前没有事务时(即以下代码中的((HibernateTransactionObject) transaction).hasTransaction()返回false),会返回以下几种:</font>
		</div>
		<div>
				<font color="#000080" size="2">
				</font> </div>
		<div>
				<font color="#008000" size="2">// Check definition settings for new transaction.<br />  if (definition.getTimeout() &lt; TransactionDefinition.TIMEOUT_DEFAULT) {<br />   throw new InvalidTimeoutException("Invalid transaction timeout", definition.getTimeout());<br />  }</font>
		</div>
		<div>
				<font color="#008000">
				</font> </div>
		<div>
				<font color="#008000" size="2">  // No existing transaction found -&gt; check propagation behavior to find out how to behave.<br />  if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {<br />   throw new IllegalTransactionStateException(<br />     "Transaction propagation 'mandatory' but no existing transaction found");<br />  }<br />  else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||<br />    definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||<br />      definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {<br />   if (debugEnabled) {<br />    logger.debug("Creating new transaction with name [" + definition.getName() + "]");<br />   }<br />   doBegin(transaction, definition);<br />   boolean newSynchronization = (this.transactionSynchronization != SYNCHRONIZATION_NEVER);<br />   return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null);<br />  }<br />  else {<br />   // Create "empty" transaction: no actual transaction, but potentially synchronization.<br />   boolean newSynchronization = (this.transactionSynchronization == SYNCHRONIZATION_ALWAYS);<br />   return newTransactionStatus(definition, null, false, newSynchronization, debugEnabled, null);<br />  }</font>
		</div>
		<div>
				<font color="#000080" size="2">
				</font> </div>
		<div>
				<font color="#000080" size="2">2.当前有事务时</font>
		</div>
		<div>
				<font color="#008000" size="2">private TransactionStatus handleExistingTransaction(<br />   TransactionDefinition definition, Object transaction, boolean debugEnabled)<br />   throws TransactionException {</font>
		</div>
		<div>
				<font color="#008000">
				</font> </div>
		<div>
				<font color="#008000" size="2">  if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NEVER) {<br />   throw new IllegalTransactionStateException(<br />     "Transaction propagation 'never' but existing transaction found");<br />  }</font>
		</div>
		<div>
				<font color="#008000">
				</font> </div>
		<div>
				<font color="#008000" size="2">  if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) {<br />   if (debugEnabled) {<br />    logger.debug("Suspending current transaction");<br />   }<br />   Object suspendedResources = suspend(transaction);<br />   boolean newSynchronization = (this.transactionSynchronization == SYNCHRONIZATION_ALWAYS);<br />   return newTransactionStatus(<br />     definition, null, false, newSynchronization, debugEnabled, suspendedResources);<br />  }</font>
		</div>
		<div>
				<font color="#008000">
				</font> </div>
		<div>
				<font color="#008000" size="2">  if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {<br />   if (debugEnabled) {<br />    logger.debug("Suspending current transaction, creating new transaction with name [" +<br />      definition.getName() + "]");<br />   }<br />   Object suspendedResources = suspend(transaction);<br />   doBegin(transaction, definition);<br />   boolean newSynchronization = (this.transactionSynchronization != SYNCHRONIZATION_NEVER);<br />   return newTransactionStatus(<br />     definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);<br />  }</font>
		</div>
		<div>
				<font color="#008000">
				</font> </div>
		<div>
				<font color="#008000" size="2">  if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {<br />   if (!isNestedTransactionAllowed()) {<br />    throw new NestedTransactionNotSupportedException(<br />      "Transaction manager does not allow nested transactions by default - " +<br />      "specify 'nestedTransactionAllowed' property with value 'true'");<br />   }<br />   if (debugEnabled) {<br />    logger.debug("Creating nested transaction with name [" + definition.getName() + "]");<br />   }<br />   if (useSavepointForNestedTransaction()) {<br />    // Create savepoint within existing Spring-managed transaction,<br />    // through the SavepointManager API implemented by TransactionStatus.<br />    // Usually uses JDBC 3.0 savepoints. Never activates Spring synchronization.<br />    DefaultTransactionStatus status =<br />      newTransactionStatus(definition, transaction, false, false, debugEnabled, null);<br />    status.createAndHoldSavepoint();<br />    return status;<br />   }<br />   else {<br />    // Nested transaction through nested begin and commit/rollback calls.<br />    // Usually only for JTA: Spring synchronization might get activated here<br />    // in case of a pre-existing JTA transaction.<br />    doBegin(transaction, definition);<br />    boolean newSynchronization = (this.transactionSynchronization != SYNCHRONIZATION_NEVER);<br />    return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null);<br />   }<br />  }</font>
		</div>
		<div> </div>
		<div>
				<font color="#000080" size="2">最后,txInfo被绑定到当前线程上作为当前事务:</font>
		</div>
		<div>
				<font color="#000080" size="2">
				</font> </div>
		<div>
				<font size="2">txInfo.bindToThread()</font>
		</div>
		<div>
				<font size="2">
				</font> </div>
		<div>
				<font color="#000080" size="2">然后,调用实际的目标类的方法并捕捉异常:</font>
		</div>
		<div>
				<font color="#000080">
				</font> </div>
		<div>
				<font size="2">try {<br />   // This is an around advice.<br />   // Invoke the next interceptor in the chain.<br />   // This will normally result in a target object being invoked.<br />   retVal = invocation.proceed();<br />  }<br />  catch (Throwable ex) {<br />   // target invocation exception<br />   doCloseTransactionAfterThrowing(txInfo, ex);<br />   throw ex;<br />  }<br />  finally {<br />   doFinally(txInfo);<br />  }<br />  doCommitTransactionAfterReturning(txInfo);<br />  return retVal;<br /> }</font>
		</div>
		<div>
				<font color="#000080">
				</font> </div>
		<div> </div>
		<div>
				<font size="2">另外一点,TransactionInfo的newTransactionStatus调用时如果参数的不是null,TransactionInfo.hasTransaction()方法返回true;</font>
		</div>
		<div>
				<font size="2">
				</font> </div>
		<div>
				<font size="2">重要提示:</font>
		</div>
		<div>
				<font size="2">在spring中创建的事务代理类并是目标类的超类,只是一个实现这目标类接口的类,该类会调用目标类的方法,所在如果一个目标类中的方法调用自身的另一个事务方法,另一个方法只是作为普通方法来调用,并不会加入事务机制</font>
		</div>
		<font size="2">
				<font style="BACKGROUND-COLOR: #ffffff" color="#800080">
						<font color="#ff0000">
								<div>
										<div>
												<hr />
										</div>
										<div>参考资料:</div>
										<div>1.Spring Reference Manual:http://static.springframework.org/spring/docs/1.2.x/reference/index.html</div>
										<div>2.Spring API doc:http://static.springframework.org/spring/docs/1.2.x/api/index.html</div>
										<div>3.Spring 的源代码</div>
								</div>
						</font>
				</font>
		</font>
<img src ="http://www.blogjava.net/baoyaer/aggbug/93851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-01-15 09:45 <a href="http://www.blogjava.net/baoyaer/articles/93851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring事务管理</title><link>http://www.blogjava.net/baoyaer/articles/93060.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 11 Jan 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/93060.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/93060.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/93060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/93060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/93060.html</trackback:ping><description><![CDATA[通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Java对象的bean。当我们定义TransactionProxyFactoryBean时，必须提供一个相关的 PlatformTransactionManager的引用和<strong>事务属性</strong>。 <strong>事务属性</strong>含有上面描述的事务定义。<pre>&lt;bean id="petStore" <br />    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />    &lt;property name="transactionManager"&gt;&lt;ref bean="transactionManager"/&gt;&lt;/property&gt;<br />    &lt;property name="target"&gt;&lt;ref bean="petStoreTarget"/&gt;&lt;/property&gt;<br />    &lt;property name="transactionAttributes"&gt;<br />        &lt;props&gt;<br />            &lt;prop key="insert*"&gt;PROPAGATION_REQUIRED,-MyCheckedException&lt;/prop&gt;<br />            &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />            &lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />        &lt;/props&gt;<br />    &lt;/property&gt;<br />&lt;/bean&gt;</pre><p>事务代理会实现目标对象的接口：这里是id为petStoreTarget的bean。（使用 CGLIB也可以实现具体类的代理。只要设置proxyTargetClass属性为true就可以。如果目标对象没有实现任何接口，这将自动设置该属性为true。通常，我们希望面向接口而不是类编程。）使用proxyInterfaces属性来限定事务代理来代 理指定接口也是可以的<img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" />（一般来说是个好想法）。也可以通过从 <tt><font face="新宋体">org.springframework.aop.framework.ProxyConfig</font></tt>继承或所有AOP代理工厂共享 的属性来定制TransactionProxyFactoryBean的行为。 </p><p>这里的transactionAttributes属性定义在 <tt><font face="新宋体">org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource</font></tt> 中的属性格式来设置。这个包括通配符的方法名称映射是很直观的。注意 insert*的映射的值包括回滚规则。添加的<tt><font face="新宋体">-MyCheckedException</font></tt> 指定如果方法抛出<tt><font face="新宋体">MyCheckedException</font></tt>或它的子类，事务将 会自动回滚。可以用逗号分隔定义多个回滚规则。<font color="#ff0000"><strong>-前缀强制回滚，+前缀指定提交</strong></font>（这允许即使抛出unchecked异常时也可以提交事务，当然你自己要明白自己 在做什么）。</p><p><tt><font face="新宋体">TransactionProxyFactoryBean</font></tt>允许你通过 “preInterceptors”和“postInterceptors”属性设置“前”或“后”通知来提供额外的 拦截行为。可以设置任意数量的“前”和“后”通知，它们的类型可以是 <tt><font face="新宋体">Advisor</font></tt>（可以包含一个切入点）， <tt><font face="新宋体">MethodInterceptor</font></tt>或被当前Spring配置支持的通知类型 （例如<tt><font face="新宋体">ThrowAdvice</font></tt>， <tt><font face="新宋体">AfterReturningtAdvice</font></tt>或<tt><font face="新宋体">BeforeAdvice</font></tt>， 这些都是默认支持的）。这些通知必须支持实例共享模式。如果你需要高级AOP特 性来使用事务，如有状态的maxin，那最好使用通用的 <tt><font face="新宋体">org.springframework.aop.framework.ProxyFactoryBean</font></tt>， 而不是<tt><font face="新宋体">TransactionProxyFactoryBean</font></tt>实用代理创建者。</p><p>也可以设置自动代理：配置AOP框架，不需要单独的代理定义类就可以生成类的 代理。</p><p>附两个spring的事务配置例子：<br />&lt;prop key="add"&gt;<br />     PROPAGATION_REQUIRES_NEW, -MyException <br />&lt;/prop&gt;<br />注：上面的意思是add方法将独占一个事务，当事务处理过程中产生MyException异常或者该异常的子类将回滚该事务。<br /><br />&lt;prop key="loadAll"&gt;<br />    PROPAGATION_SUPPORTS, ISOLATION_READ_COMMITED, Readonly<br />&lt;/prop&gt;<br />注：表示loadAll方法支持事务，而且不会读取没有提交事务的数据。它的数据为只读（这样有助于提高读取的性能）<br /><br />附A Spring中的所有事务策略<br /><br />PROPAGATION_MANDATORY<br />PROPAGATION_NESTED <br />PROPAGATION_NEVER <br />PROPAGATION_NOT_SUPPORTED<br />PROPAGATION_REQUIRED<br />PROPAGATION_REQUIRED_NEW<br />PROPAGATION_SUPPORTS<br /><br />附B Spring中所有的隔离策略：<br /><br />ISOLATION_DEFAULT<br />ISOLATION_READ_UNCOMMITED<br />ISOLATION_COMMITED<br />ISOLATION_REPEATABLE_READ<br />ISOLATION_SERIALIZABLE </p><p><a href="/DenisLing/archive/2005/12/18/spring.html" target="_blank"><font color="#000000" size="6"><strong>Spring事务类型祥解</strong></font></a><font size="6"><strong></strong></font></p><p>大家可能在spring中经常看到这样的定义：</p><p> </p><p>&lt;prop key="load*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;&lt;prop key="store*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;</p><p>估计有好多朋友还没有弄清楚里面的值的意思，仔细看完下面应该知道自己什么情况下面应该使用什么样的声明。^_^<br /></p><p> </p><p>Spring中常用事务类型：<br /></p><ul><li>PROPAGATION_REQUIRED--支持当前事务，如果当前没有事务，就新建一个事务。这是最常见的选择。 <br /></li><li>PROPAGATION_SUPPORTS--支持当前事务，如果当前没有事务，就以非事务方式执行。 <br /></li><li>PROPAGATION_MANDATORY--支持当前事务，如果当前没有事务，就抛出异常。 <br /></li><li>PROPAGATION_REQUIRES_NEW--新建事务，如果当前存在事务，把当前事务挂起。 <br /></li><li>PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作，如果当前存在事务，就把当前事务挂起。 <br /></li><li>PROPAGATION_NEVER--以非事务方式执行，如果当前存在事务，则抛出异常。 <br /></li><li>PROPAGATION_NESTED--如果当前存在事务，则在嵌套事务内执行。如果当前没有事务，则进行与PROPAGATION_REQUIRED类似的操作。<br /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /><img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/regular_smile.gif" /></li></ul><div id="articleview_summary">摘要：<br />Spring和EJB一样，提供了两种事务管理方式：编程式和声明式。在考试系统中我们将使用声明式的事务管理，这是spring推荐的做法。使用这种方式可以体验到spring的强大便捷，而且我们无须在Dao类中编写任何特殊的代码，只需要通过配置文件就可以让普通的java类加载到事务管理中，这个意义是很重大的。 <br /><br /><br />本文Matrix永久镜像：<a href="http://www.matrix.org.cn/resource/article/1/1339.html">http://www.matrix.org.cn/resource/article/1/1339.html</a><br />说明：本文可能由Matrix原创，也可能由Matrix的会员整理，或者由<br />Matrix的Crawler在全球知名Java或者其他技术相关站点抓取并永久<br />保留镜像，Matrix会保留所有原来的出处URL，并在显著地方作出说明，<br />如果你发觉出处URL有误，请联系Matrix改正.<br /></div><div id="divarticlecontent">四、Spring中的事务控制<br /><br />Spring和EJB一样，提供了两种事务管理方式：编程式和声明式。在考试系统中我们将使用声明式的事务管理，这是spring推荐的做法。使用这种方式可以体验到spring的强大便捷，而且我们无须在Dao类中编写任何特殊的代码，只需要通过配置文件就可以让普通的java类加载到事务管理中，这个意义是很重大的。<br /><br />Spring中进行事务管理的通常方式是利用AOP（面向切片编程）的方式，为普通java类封装事务控制，它是通过动态代理实现的，由于接口是延迟实例化的，spring在这段时间内通过拦截器，加载事务切片。原理就是这样，具体细节请参考jdk中有关动态代理的文档。本文主要讲解如何在spring中进行事务控制。<br /><br />动态代理的一个重要特征是，它是针对接口的，所以我们的dao要通过动态代理来让spring接管事务，就必须在dao前面抽象出一个接口，当然如果没有这样的接口，那么spring会使用CGLIB来解决问题，但这不是spring推荐的方式，我们也不做讨论。<br /><br />参照前面的例子，我们为StudentManager.java定义一个接口，它的内容如下：<br /><br /><pre class="overflow" title="pre code">/*<br /> * 创建日期 2005-3-25<br /> */<br />package org.bromon.spring.examer.student;<br /><br />import java.util.List;<br /><br />import org.bromon.spring.examer.pojo.Student;<br /><br />/**<br /> * @author Bromon<br /> */<br />public interface StudentManagerInterface<br />{<br />    public void add(Student s);<br />    public void del(Student s);<br />    public void update(Student s);<br />    <br />    public List loadAll();<br />    public Student loadById(int id);<br />}</pre><br />StudentManager也应该做出修改，实现该接口：<br /><br /><pre class="overflow" title="pre code">public class StudentManager extends HibernateDaoSupport implements StudentManagerInterface</pre><br />现在需要修改配置文件，用于定义Hibrenate适用的事务管理器，并且把sessionFactory注入进去，同时还需要通过注册一个DefaultTransactionAttribute对象，来指出事务策略。其中sessionFactory的定义已经在本文的第三章中说明。<br /><br />首先定义一个Hibernate的事务管理器，让它来管理sessionFactory：<br /><pre class="overflow" title="pre code">&lt;bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;<br />      &lt;property name="sessionFactory"&gt;<br />         &lt;ref bean="sessionFactory"/&gt;<br />      &lt;/property&gt;<br />&lt;/bean&gt;</pre><br />下面定义事务管理策略，我们希望把策略定义在方法这个级别上，提供最大的灵活性，本例中将add方法定义为：PROPAGATION_REQUIRES_NEW，这可以保证它将始终运行在一个事务中。<br /><br /><pre class="overflow" title="pre code">&lt;bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"&gt;<br />      &lt;property name="properties"&gt;<br />         &lt;props&gt;<br />            &lt;prop key="add"&gt;<br />               PROPAGATION_REQUIRES_NEW<br />            &lt;/prop&gt;<br />         &lt;/props&gt;<br />      &lt;/property&gt;<br />   &lt;/bean&gt;</pre><br />我们不仅可以为add方法定义事务策略,还可以定义事务隔离程度和回滚策略,他们以逗号隔开,比如我们的add事务可以定义为:<br /><br /><pre class="overflow" title="pre code">&lt;prop key="add"&gt;<br />   PROPAGATION_REQUIRES_NEW,-ExamerException<br />&lt;/prop</pre>&gt;<br /><br />这个事务策略表示add方法将会独占一个事务，当事务过程中产生ExamerException异常，事务会回滚。<br /><br />Add/update/del都是写入方法，对于select（读取）方法，我们可以指定较为复杂的事务策略，比如对于loadAll()方法：<br /><br /><pre class="overflow" title="pre code">&lt;prop key=”loadAll”&gt;<br />      PROPAGATION_SUPPORTS,ISOLATION_READ_COMMITED,readOnly<br />   &lt;/prop&gt;</pre><br /><br />该事务的含义为，loadAll方法支持事务，不会读去位提交的数据，它的数据为只读（可提高执行速度）。<br /><br />如你所见，我们的StudentManagerInterface接口中还有一个loadById(int id)方法，也许我们将来还会有很多的loadByXXXX的方法，难道要意义为他们指定事务策略？太烦人了，他们应该和loadAll()一样，所以我们可以使用通配符，定义所有的loadXXXX方法：<br /><br /><pre class="overflow" title="pre code">&lt;prop key=”load*”&gt;<br />      PROPAGATION_SUPPORTS,ISOLATION_READ_COMMITED,readOnly<br />   &lt;/prop&gt;</pre><br /><br />现在可以定义事务管理器：<br /><pre class="overflow" title="pre code">&lt;bean id="studentManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />      &lt;property name="target"&gt;<br />         &lt;ref bean="studentManager"/&gt;<br />      &lt;/property&gt;<br />      &lt;property name="transactionManager"&gt;<br />         &lt;ref bean="transactionManager"/&gt;<br />      &lt;/property&gt;<br />      &lt;property name="transactionAttributeSource"&gt;<br />         &lt;ref bean="transactionAttributeSource"/&gt;<br />      &lt;/property&gt;<br />&lt;/bean&gt;</pre><br /><br />这个bean的外观是一个接口(StudentManagerInterface)，我们指出了它的具体实现(studentManager)，而且为它绑定了事务策略。在客户端使用的时候，获得对象是StudentManagerInterface，所有的操作都是针对这个接口的。测试代码并没有改变，我们虽然修改了很多地方，加入了事务控制，但是客户端并没有受到影响，这也体现了spring的一些优势。测试代码如下：<br /><br /><pre class="overflow" title="pre code">public void testAdd() <br />    {<br />        ApplicationContext ctx=new ClassPathXmlApplicationContext("springConfig.xml");<br />        StudentManager sm=(StudentManager)ctx.getBean("studentManager");<br />        <br />        Student s=new Student();<br />        s.setId(1);<br />        s.setName("bromon");<br />        s.setPassword("123");<br />        s.setGrade(1);<br />        s.setSex(0);<br />        <br />        sm.add(s);<br />}</pre><br /><br />通过以上的代码可以看出，spring可以简单的把普通的java class纳入事务管理，声明性的事务操作起来也很容易。有了spring之后，声明性事务不再是EJB独有，我们不必为了获得声明性事务的功能而去忍受EJB带来的种种不便。<br /><br />我所使用的mysql是不支持事务的，你可以更换使用PostgreSQL，有了spring+hibernate，更换db并不像以前那样恐怖了，步骤很简单：<br /><br />1、 添加PostgreSQL的jdbc驱动<br />2、 修改dataSource配置，包括驱动名称、url、帐号、密码<br />3、 修改sessionFactory的数据库dailet为net.sf.hibernate.dialect.PostgreSQLDialect<br />4、 修改hbm.xml中的主键生成策略为increment<br /><br />所有的修改都在配置文件中完成，业务代码不需要任何修改，我很满意，How about u?<br /></div><p> </p><p> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /> <img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/angry_smile.gif" /></p><h2><a id="viewpost1_TitleUrl" href="/kaktos/archive/2006/03/08/34301.html">spring声明式事务管理的两种方式</a></h2><div class="postText">传统的：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> <font size="1">1</font></span><font size="1"> <span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> class</span><span style="COLOR: rgb(0,0,255)">="org.apache.commons.dbcp.BasicDataSource"</span><span style="COLOR: rgb(255,0,0)"> destroy-method</span><span style="COLOR: rgb(0,0,255)">="close"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="driverClassName"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="oracle.jdbc.driver.OracleDriver"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="url"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="jdbc:oracle:thin:@127.0.0.1:1521:dev"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="username"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="kaktos"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="password"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="kaktos"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="txManager"</span><span style="COLOR: rgb(255,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(255,0,0)">        class</span><span style="COLOR: rgb(0,0,255)">="org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> ref</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="businessBean"</span><span style="COLOR: rgb(255,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(255,0,0)">        class</span><span style="COLOR: rgb(0,0,255)">="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="transactionManager"</span><span style="COLOR: rgb(255,0,0)"> ref</span><span style="COLOR: rgb(0,0,255)">="txManager"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="target"</span><span style="COLOR: rgb(255,0,0)"> ref</span><span style="COLOR: rgb(0,0,255)">="businessBeanTarget"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="transactionAttributes"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">props</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">                <br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,0,0)">                </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">prop </span><span style="COLOR: rgb(255,0,0)">key</span><span style="COLOR: rgb(0,0,255)">="*"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">PROPAGATION_REQUIRED</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">prop</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">props</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">property</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)">    <br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="businessBeanTarget"</span><span style="COLOR: rgb(255,0,0)"> class</span><span style="COLOR: rgb(0,0,255)">="sample.spring.trans.BusinessBean"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> ref</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span></font></div><br />这样做的弊端就是不得不为每个需要事务的bean做一次声明，如果所有的bean都基本上有一致的配置，这样就太繁琐啦。<br />下面是第二种方式：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <font size="1"><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">beans</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> class</span><span style="COLOR: rgb(0,0,255)">="org.apache.commons.dbcp.BasicDataSource"</span><span style="COLOR: rgb(255,0,0)"> destroy-method</span><span style="COLOR: rgb(0,0,255)">="close"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="driverClassName"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="oracle.jdbc.driver.OracleDriver"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="url"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="</span><span style="COLOR: rgb(0,0,255)">jdbc:oracle:thin:@127.0.0.1:1521:dev</span><span style="COLOR: rgb(0,0,255)">"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="username"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="kaktos"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="password"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="kaktos"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="txManager"</span><span style="COLOR: rgb(255,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(255,0,0)">        class</span><span style="COLOR: rgb(0,0,255)">="org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> ref</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="matchAllWithPropReq"</span><span style="COLOR: rgb(255,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(255,0,0)">        class</span><span style="COLOR: rgb(0,0,255)">="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="transactionAttribute"</span><span style="COLOR: rgb(255,0,0)"> value</span><span style="COLOR: rgb(0,0,255)">="PROPAGATION_REQUIRED"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,0,0)">    <br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="matchAllTxInterceptor"</span><span style="COLOR: rgb(255,0,0)"> class</span><span style="COLOR: rgb(0,0,255)">="org.springframework.transaction.interceptor.TransactionInterceptor"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="transactionManager"</span><span style="COLOR: rgb(255,0,0)"> ref</span><span style="COLOR: rgb(0,0,255)">="txManager"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="transactionAttributeSource"</span><span style="COLOR: rgb(255,0,0)"> ref</span><span style="COLOR: rgb(0,0,255)">="matchAllWithPropReq"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="autoProxyCreator"</span><span style="COLOR: rgb(255,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(255,0,0)">        class</span><span style="COLOR: rgb(0,0,255)">="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="interceptorNames"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">list</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,0,0)">                </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">idref </span><span style="COLOR: rgb(255,0,0)">local</span><span style="COLOR: rgb(0,0,255)">="matchAllTxInterceptor"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">list</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">property</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="beanNames"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">list</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,0,0)">                </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">idref </span><span style="COLOR: rgb(255,0,0)">local</span><span style="COLOR: rgb(0,0,255)">="businessBean"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">list</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">property</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,0,0)">    <br /></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,128,0)">&lt;!--</span><span style="COLOR: rgb(0,128,0)">  my beans  </span><span style="COLOR: rgb(0,128,0)">--&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">39</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">bean </span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="businessBean"</span><span style="COLOR: rgb(255,0,0)"> class</span><span style="COLOR: rgb(0,0,255)">="sample.spring.trans.BusinessBean"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">40</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">property </span><span style="COLOR: rgb(255,0,0)">name</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> ref</span><span style="COLOR: rgb(0,0,255)">="dataSource"</span><span style="COLOR: rgb(255,0,0)"> </span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">41</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">bean</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">42</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">beans</span><span style="COLOR: rgb(0,0,255)">&gt;</span></font></div><br /><span style="COLOR: rgb(0,0,255)">BeanNameAutoProxyCreator<font color="#000000">会在applicationcontext初始化后自动为beanNames属性中的bean建立proxy。</font></span><br /></div><img src ="http://www.blogjava.net/baoyaer/aggbug/93060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-01-11 09:31 <a href="http://www.blogjava.net/baoyaer/articles/93060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring的ParameterMethodNameResolver</title><link>http://www.blogjava.net/baoyaer/articles/93055.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 11 Jan 2007 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/93055.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/93055.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/93055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/93055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/93055.html</trackback:ping><description><![CDATA[
		<p>spring的ParameterMethodNameResolver的可以根据不同的参数执行不同方法,类似Struts的dyncaction<br />下面有一个例子<br />package ee.bug;</p>
		<p>import java.util.ArrayList;<br />import java.util.Date;<br />import java.util.List;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.springframework.web.servlet.ModelAndView;<br />import org.springframework.web.servlet.mvc.multiaction.MultiActionController;<br />public class ProductController extends MultiActionController {</p>
		<p> /**<br />  * Handles view<br />  */<br /> public ModelAndView view(HttpServletRequest request, HttpServletResponse response) throws Exception {</p>
		<p>  response.getOutputStream().print("Viewing");</p>
		<p>  return null;<br /> }</p>
		<p> /**<br />  * Handles index<br />  */<br /> public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception {<br />  response.getOutputStream().print("index");<br />  return null;<br /> }<br /> <br />}<br />配置文件<br /> &lt;bean id="productMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"&gt;<br />        &lt;property name="paramName"&gt;&lt;value&gt;method&lt;/value&gt;&lt;/property&gt;<br />        &lt;property name="defaultMethodName"&gt;&lt;value&gt;view&lt;/value&gt;&lt;/property&gt;<br />    &lt;/bean&gt;<br />    &lt;bean id="productController" class="ee.bug.ProductController"&gt;<br />        &lt;property name="methodNameResolver"&gt;&lt;ref local="productMethodNameResolver"/&gt;&lt;/property&gt;<br />    &lt;/bean&gt;<br />     <font color="#f70909">&lt;property name="paramName"&gt;&lt;value&gt;method&lt;/value&gt;&lt;/property&gt;参数名为method 默认为action<br /></font>     <br />输入view.do?method=view 显示Viewing<br />输入view.do?method=indedx 显示index<br />输入/view.do?method=fdsf  显示404错误</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/93055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-01-11 09:05 <a href="http://www.blogjava.net/baoyaer/articles/93055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring发送邮件</title><link>http://www.blogjava.net/baoyaer/articles/92555.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 09 Jan 2007 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/92555.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/92555.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/92555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/92555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/92555.html</trackback:ping><description><![CDATA[
		<table class="contentTable" cellspacing="0" cellpadding="0" width="92%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<div class="articleText">
												<br />这次来看看Spring提高的一些有用过的J2EE中使用到的功能,如 发送Email, 执行定时任务... <br /><br /><br />先来看看发送Email吧, 在Spring中发送Email是很简单的,使用Spring提高的MailSender和MailMessage就可以了,配置代码如下: <br /><font color="#008080"><br /></font><div align="left"><div align="left"><div align="left"><div align="left"><div align="left"><div align="left"><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><p><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;</p><p>&lt;beans&gt;<br />&lt;bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"&gt;<br />    &lt;property name="host"&gt;<br />        &lt;value&gt;smtp.163.com&lt;/value&gt;<br />    &lt;/property&gt;<br />&lt;property name="javaMailProperties"&gt;<br />&lt;props&gt;<br />&lt;!-- 如果要使用用户名和密码验证,这一步需要 --&gt;</p><p>       &lt;prop key="mail.smtp.auth"&gt;true&lt;/prop&gt;<br />  &lt;/props&gt;<br /> &lt;/property&gt;<br />&lt;property name="username"&gt;<br />    &lt;value&gt;yong hu ming &lt;/value&gt;<br />&lt;/property&gt;<br />&lt;property name="password"&gt;<br />     &lt;value&gt;mi ma&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;!-- 简单的message --&gt;</p><p>&lt;bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage"&gt;<br />&lt;property name="to"&gt;<br />&lt;value&gt;shou jian ren&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;property name="from"&gt;<br />&lt;value&gt;ni de you xiang di zhi&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;property name="subject"&gt; &lt;!-- Email 标题 --&gt;<br />&lt;value&gt;A Spring Mail sender test to my baoyaer&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;!-- 测试发送的类 --&gt;</p><p>&lt;bean id="testMailSender" class="test.SpringMail.TestSenderMail"&gt;<br />&lt;property name="mailMessage"&gt;<br />&lt;ref bean="mailMessage"/&gt;<br />&lt;/property&gt;<br />&lt;property name="mailSender"&gt;<br />&lt;ref bean="mailSender"/&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;</p><p><br />&lt;/beans&gt;</p></div>  <br />上面的配置好以后就可以直接发送了, 看看TestSenderMail.java的代码: <br /><br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> test.mail;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.mail.MailException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.mail.MailSender;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.mail.SimpleMailMessage;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_191_1005_Open_Image" onclick="this.style.display='none'; Codehighlighter1_191_1005_Open_Text.style.display='none'; Codehighlighter1_191_1005_Closed_Image.style.display='inline'; Codehighlighter1_191_1005_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_191_1005_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_191_1005_Closed_Text.style.display='none'; Codehighlighter1_191_1005_Open_Image.style.display='inline'; Codehighlighter1_191_1005_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> TestSenderMail </span><span id="Codehighlighter1_191_1005_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_191_1005_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> MailSender mailSender;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> SimpleMailMessage mailMessage;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_296_305_Open_Image" onclick="this.style.display='none'; Codehighlighter1_296_305_Open_Text.style.display='none'; Codehighlighter1_296_305_Closed_Image.style.display='inline'; Codehighlighter1_296_305_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_296_305_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_296_305_Closed_Text.style.display='none'; Codehighlighter1_296_305_Open_Image.style.display='inline'; Codehighlighter1_296_305_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> TestSenderMail() </span><span id="Codehighlighter1_296_305_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_296_305_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_354_382_Open_Image" onclick="this.style.display='none'; Codehighlighter1_354_382_Open_Text.style.display='none'; Codehighlighter1_354_382_Closed_Image.style.display='inline'; Codehighlighter1_354_382_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_354_382_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_354_382_Closed_Text.style.display='none'; Codehighlighter1_354_382_Open_Image.style.display='inline'; Codehighlighter1_354_382_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> SimpleMailMessage getMailMessage() </span><span id="Codehighlighter1_354_382_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_354_382_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> mailMessage;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_444_484_Open_Image" onclick="this.style.display='none'; Codehighlighter1_444_484_Open_Text.style.display='none'; Codehighlighter1_444_484_Closed_Image.style.display='inline'; Codehighlighter1_444_484_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_444_484_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_444_484_Closed_Text.style.display='none'; Codehighlighter1_444_484_Open_Image.style.display='inline'; Codehighlighter1_444_484_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setMailMessage(SimpleMailMessage mailMessage) </span><span id="Codehighlighter1_444_484_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_444_484_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.mailMessage </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> mailMessage;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_522_549_Open_Image" onclick="this.style.display='none'; Codehighlighter1_522_549_Open_Text.style.display='none'; Codehighlighter1_522_549_Closed_Image.style.display='inline'; Codehighlighter1_522_549_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_522_549_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_522_549_Closed_Text.style.display='none'; Codehighlighter1_522_549_Open_Image.style.display='inline'; Codehighlighter1_522_549_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> MailSender getMailSender() </span><span id="Codehighlighter1_522_549_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_522_549_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> mailSender;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_602_640_Open_Image" onclick="this.style.display='none'; Codehighlighter1_602_640_Open_Text.style.display='none'; Codehighlighter1_602_640_Closed_Image.style.display='inline'; Codehighlighter1_602_640_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_602_640_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_602_640_Closed_Text.style.display='none'; Codehighlighter1_602_640_Open_Image.style.display='inline'; Codehighlighter1_602_640_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setMailSender(MailSender mailSender) </span><span id="Codehighlighter1_602_640_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_602_640_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.mailSender </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> mailSender;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_670_1003_Open_Image" onclick="this.style.display='none'; Codehighlighter1_670_1003_Open_Text.style.display='none'; Codehighlighter1_670_1003_Closed_Image.style.display='inline'; Codehighlighter1_670_1003_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_670_1003_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_670_1003_Closed_Text.style.display='none'; Codehighlighter1_670_1003_Open_Image.style.display='inline'; Codehighlighter1_670_1003_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> sendMail() </span><span id="Codehighlighter1_670_1003_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_670_1003_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    SimpleMailMessage message </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> SimpleMailMessage(mailMessage);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置email内容, </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    message.setText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">测试Spring 发送Email.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_813_851_Open_Image" onclick="this.style.display='none'; Codehighlighter1_813_851_Open_Text.style.display='none'; Codehighlighter1_813_851_Closed_Image.style.display='inline'; Codehighlighter1_813_851_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_813_851_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_813_851_Closed_Text.style.display='none'; Codehighlighter1_813_851_Open_Image.style.display='inline'; Codehighlighter1_813_851_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_813_851_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_813_851_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      mailSender.send(message);<br /><img id="Codehighlighter1_877_999_Open_Image" onclick="this.style.display='none'; Codehighlighter1_877_999_Open_Text.style.display='none'; Codehighlighter1_877_999_Closed_Image.style.display='inline'; Codehighlighter1_877_999_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_877_999_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_877_999_Closed_Text.style.display='none'; Codehighlighter1_877_999_Open_Image.style.display='inline'; Codehighlighter1_877_999_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (MailException e) </span><span id="Codehighlighter1_877_999_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_877_999_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO Auto-generated catch block</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">      System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">O . 发送Email失败了<img src="http://www.blogjava.net/images/dot.gif" />.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      e.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><br /><br />很简单吧. 下面是测试类: TestApp.java <br /><br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> test.mail;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.context.ApplicationContext;<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.context.support.ClassPathXmlApplicationContext;<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id="Codehighlighter1_172_977_Open_Image" onclick="this.style.display='none'; Codehighlighter1_172_977_Open_Text.style.display='none'; Codehighlighter1_172_977_Closed_Image.style.display='inline'; Codehighlighter1_172_977_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_172_977_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_172_977_Closed_Text.style.display='none'; Codehighlighter1_172_977_Open_Image.style.display='inline'; Codehighlighter1_172_977_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> TestApp </span><span id="Codehighlighter1_172_977_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_172_977_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img id="Codehighlighter1_177_202_Open_Image" onclick="this.style.display='none'; Codehighlighter1_177_202_Open_Text.style.display='none'; Codehighlighter1_177_202_Closed_Image.style.display='inline'; Codehighlighter1_177_202_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_177_202_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_177_202_Closed_Text.style.display='none'; Codehighlighter1_177_202_Open_Image.style.display='inline'; Codehighlighter1_177_202_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span id="Codehighlighter1_177_202_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_177_202_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * </span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000"> args<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id="Codehighlighter1_245_501_Open_Image" onclick="this.style.display='none'; Codehighlighter1_245_501_Open_Text.style.display='none'; Codehighlighter1_245_501_Closed_Image.style.display='inline'; Codehighlighter1_245_501_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_245_501_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_245_501_Closed_Text.style.display='none'; Codehighlighter1_245_501_Open_Image.style.display='inline'; Codehighlighter1_245_501_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span id="Codehighlighter1_245_501_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_245_501_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO Auto-generated method stub</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    ApplicationContext context </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ClassPathXmlApplicationContext(<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test/mail/mail.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    TestSenderMail sender </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (TestSenderMail) context<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        .getBean(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">testMailSender</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    sender.sendMail();<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">抛出如下异常,是瑞星监控的问题,关闭就可以了</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #008000"><img id="Codehighlighter1_532_975_Open_Image" onclick="this.style.display='none'; Codehighlighter1_532_975_Open_Text.style.display='none'; Codehighlighter1_532_975_Closed_Image.style.display='inline'; Codehighlighter1_532_975_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_532_975_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_532_975_Closed_Text.style.display='none'; Codehighlighter1_532_975_Open_Image.style.display='inline'; Codehighlighter1_532_975_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">  </span><span id="Codehighlighter1_532_975_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_532_975_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * DEBUG SMTP: QUIT failed with 250 O . 发送Email失败了<img src="http://www.blogjava.net/images/dot.gif" />.<br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * org.springframework.mail.MailSendException: Could not send mails: 354<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * <br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * com.sun.mail.smtp.SMTPSendFailedException: 354<br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * <br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * at<br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)<br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * at com.sun.mail.smtp.SMTPTransport.finishData(SMTPTransport.java:1215) at<br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   * com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:586)<br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><br /><br />呵呵, 现在就可以发送Email了.</div></div></div></div></div></div></div>
								</td>
						</tr>
						<tr>
								<td>
										<div id="extInfor">
												<font style="FONT-SIZE: 12px" color="#999999">
														<br />
												</font>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/baoyaer/aggbug/92555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-01-09 11:28 <a href="http://www.blogjava.net/baoyaer/articles/92555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>