﻿<?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-勤加练习，必能得心应手！不期速成，日拱一卒 ！-随笔分类-Spring</title><link>http://www.blogjava.net/ldwblog/category/41228.html</link><description>态度决定一切</description><language>zh-cn</language><lastBuildDate>Tue, 07 Jan 2020 10:49:26 GMT</lastBuildDate><pubDate>Tue, 07 Jan 2020 10:49:26 GMT</pubDate><ttl>60</ttl><item><title>个人公众号「Java爱好者社区」高质量原创文章持续输出，欢迎各位小主关注</title><link>http://www.blogjava.net/ldwblog/archive/2019/10/30/434887.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 30 Oct 2019 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2019/10/30/434887.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/434887.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2019/10/30/434887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/434887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/434887.html</trackback:ping><description><![CDATA[blogjava网站与博客园合并了，对blogjava还是有感情的。<br />并且blogjava网站发布的文章是在博客园首页看不到的。<br />blogjava网站首页能看到，你可以点击标题进入可以看到图片二维码信息。<br /><br /><strong style="color: red; font-size: 14pt;">Java爱好者社区</strong><br />公众号内容简介：<br /><p><span style="background-color: yellow; color: red;">专注于分享Java后端相关技术、老司机实战干货，不限于JVM、并发、设计模式、性能优化、分布式&amp;微服务、云原生、大数据相关主题。</span><br style="color: red;" /><span style="background-color: yellow; color: red;">希望关注的你停下脚步，定有所收获。</span><br style="color: red;" /><br />以前的个人博客内容不好迁移，所以我打算根据自己的多年经验，不断整理输出有价值的内容。<br />目前公众号内容有关于<span style="background-color: yellow; color: red;">SpringCloud（微服务框架）、Skywalking（APM监控调用链）、JVM（GC分析、内存泄漏分析）、并发编程</span>相关原创实战文章已出炉。<br /><br />最近刚开始已经有不少小伙伴关注了，期待能有幸搜索到本博客的同学，可以扫码关注一下，不胜感激。<br />大家有任何技术、职场、面试上的问题都可以与我交流。<br /><br /><span style="background-color: yellow;"><strong>方式一：</strong></span><span style="color: red; background-color: yellow;"><strong>扫码以下公众号二维码：</strong></span><br /><img src="http://www.blogjava.net/images/blogjava_net/ldwblog/Java%E7%88%B1%E5%A5%BD%E8%80%85%E7%A4%BE%E5%8C%BA%E4%BA%8C%E7%BB%B4%E7%A0%81.png" border="0" alt="" /><br /><br />方式二：<span style="color: red;">在微信上直接搜索：&nbsp;</span><span style="color: red; background-color: yellow;">javatech_cbo</span><br /><br />感谢各位小伙伴的支持，后续会在该公众号上输出大量的有价值的实战干货 ，期待与你一同进步与成长。<br /></p><img src ="http://www.blogjava.net/ldwblog/aggbug/434887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2019-10-30 14:10 <a href="http://www.blogjava.net/ldwblog/archive/2019/10/30/434887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mybatis3.2.1整合Spring3.1</title><link>http://www.blogjava.net/ldwblog/archive/2013/07/10/401418.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 10 Jul 2013 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/07/10/401418.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/401418.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/07/10/401418.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/401418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/401418.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 根据官方的说法，在ibatis3，也就是Mybatis3问世之前，Spring3的开发工作就已经完成了，所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring的需求。下面就将通过Mybatis-Spring来整合Mybatis跟Spring的用法做一个简单的介绍。MapperFactoryB...&nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2013/07/10/401418.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/401418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-07-10 18:07 <a href="http://www.blogjava.net/ldwblog/archive/2013/07/10/401418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 3.2三个值得关注的新特性</title><link>http://www.blogjava.net/ldwblog/archive/2013/07/10/401397.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 10 Jul 2013 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/07/10/401397.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/401397.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/07/10/401397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/401397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/401397.html</trackback:ping><description><![CDATA[<p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;">不得不承认的是,在目前的web应用开发中,Spring的应用越来越广泛,其地位变得相当重要。而在最近推出的Spring 3.2版本中，又引入了一些新的值得关注的特性。本文中将介绍其中一些值得关注的新特性。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;"><strong>一　不再需要web.xml</strong></p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;"><strong>　</strong>在新的Spring 3.2中，可以不再需要web.xml这个文件了，这得益于Servlet 3.0的新特性。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;">其中，可以使用@WebServlet在需要调用的servlet中，使用注解去设置servlet中的映射关系。这样的话，就可以不再象以往那样要通过在web.xml中对servlet进行配置，十分方便。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;">此外，Servlet 3.0提供了既能在容器中动态注册servlet的方法，也提供了通过实现</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;">ServletContainerInitializer接口的方法实现在容器启动阶段为容器动态注册Servlet、Filter和listeners。容器会在应用的启动阶段，调用所有实现ServletContainerInitializer接口类中的onStartup()方法。而Spring　3.2中，则进一步简化了这点，只需要实现WebApplicationInitializer接口就可以了，其中提供了一个相关的实现类－－AbstractContextLoaderInitializer，它可以动态注册DispatcherServlet。这意味着，只要spring-webmvc.jar放置在web应用的web-inf/lib中，就可以调用Dispatcher servlet了。可以参考如下的例子（来自Spring文档）：</p><pre style="margin-top: 0px; padding: 0px; color: #333333; font-family: 'Courier New', monospace; font-size: 12px; width: 590.8333740234375px; overflow: auto; background-color: #e6e6e6; line-height: 27.986112594604492px;"><ol style="margin-left: 55px; padding: 5px 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; word-wrap: break-word; word-break: normal; border: none; background-color: #f7f7f7; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 1px !important;"><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">public</span>&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">class</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;MyWebApplicationInitializer&nbsp;</span><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">implements</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;WebApplicationInitializer&nbsp;{&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;">&nbsp;</li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #646464; background-color: inherit;">@Override</span>&nbsp;</span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">public</span>&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">void</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;onStartup(ServletContext&nbsp;container)&nbsp;{&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletRegistration.Dynamic&nbsp;registration&nbsp;=&nbsp;container.addServlet(<span style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">"dispatcher"</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">,&nbsp;</span><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">new</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;DispatcherServlet());&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;registration.setLoadOnStartup(<span style="margin: 0px; padding: 0px; border: none; color: #c00000; background-color: inherit;">1</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">);&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;registration.addMapping(<span style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">"/example/*"</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">);&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;">&nbsp;</li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">}&nbsp;</span></li></ol></pre><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;"><strong>二　支持Java</strong><strong>编程式配置</strong><strong></strong>在Spring mvc 3.2中，一个不错的特性就是在之前版本中支持使用Java代码配置各种依赖注入的基础上，进一步简化了配置。关于使用Java编程式配置的好处，可以通过下面这个链接文章的介绍去学习</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;">（<a href="http://blog.frankel.ch/consider-replacing-spring-xml-configuration-with-javaconfig" _href="http://blog.frankel.ch/consider-replacing-spring-xml-configuration-with-javaconfig" style="color: #004276;">http://blog.frankel.ch/consider-replacing-spring-xml-configuration-with-javaconfig</a>）。<br style="clear: both; width: 0px; height: 0px;" />在Spring mvc 3.2中，提供了<span style="background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">AbstractContextLoaderInitialize</span><span style="background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">的一个子类</span><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">AbstractAnnotationConfigDispatcherServletInitializer</span></code><span style="background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">去实现零</span><span style="background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">XML</span><span style="background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">配置的效果，只需要创建的类继承</span><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">AbstractAnnotationConfigDispatcherServletInitializer</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">就可以了，如下代码所示：</span></code></p><pre style="margin-top: 0px; padding: 0px; color: #333333; font-family: 'Courier New', monospace; font-size: 12px; width: 590.8333740234375px; overflow: auto; background-color: #e6e6e6; line-height: 27.986112594604492px;"><ol style="margin-left: 55px; padding: 5px 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; word-wrap: break-word; word-break: normal; border: none; background-color: #f7f7f7; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 1px !important;"><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">public</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;">&nbsp;</li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">class</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;">&nbsp;</li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">SugarSpringWebInitializer&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">extends</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;AbstractAnnotationConfigDispatcherServletInitializer&nbsp;{&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;">&nbsp;</li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #646464; background-color: inherit;">@Override</span>&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">protected</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;Class&lt;?&gt;[]&nbsp;getRootConfigClasses()&nbsp;{&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">return</span>&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">new</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;Class[]&nbsp;{&nbsp;JavaConfig.</span><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">class</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;};&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;">&nbsp;</li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #646464; background-color: inherit;">@Override</span>&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">protected</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;Class&lt;?&gt;[]&nbsp;getServletConfigClasses()&nbsp;{&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">return</span>&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">new</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;Class[]&nbsp;{&nbsp;WebConfig.</span><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">class</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;};&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;">&nbsp;</li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #646464; background-color: inherit;">@Override</span>&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">protected</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;String[]&nbsp;getServletMappings()&nbsp;{&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">return</span>&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">new</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;String[]&nbsp;{&nbsp;</span><span style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">"/"</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;};&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;">&nbsp;</li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">}&nbsp;</span></li></ol></pre><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;"><strong><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">三</span><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">功能更强大的</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">Spring Test&nbsp;</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">框架</span></code></strong><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;"><strong></strong></span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">现在，单元测试显得越来越重要了，每一个类都建议做好对应的单元测试。在</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">Spring 3.2</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">版本之前，如果要对</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">Spring MVC</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">进行单元测试的话，必须显式去调用某个控制器类中的某个方法，而不能直接单元测试相关的</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">mapping</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">映射。而在</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">Spring mvc 3.2</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">中，重新整合和增强了测试框架的功能，支持直接用</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">/*</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">这样的映射方式去测试某个控制器中的类。同时，之前的开源项目（</span></code><a href="https://github.com/SpringSource/spring-test-mvc%EF%BC%89%E4%B9%9F%E8%A2%AB%E6%94%B6%E5%BD%95%E5%88%B0Spring%20mvc%203.2" _href="https://github.com/SpringSource/spring-test-mvc）也被收录到Spring%20mvc%203.2" style="color: #004276;"><span style="border: 1px windowtext; padding: 0px; background-color: white; background-position: initial initial; background-repeat: initial initial;">https://github.com/SpringSource/spring-test-mvc</span><span style="border: 1px windowtext; padding: 0px; background-color: white; background-position: initial initial; background-repeat: initial initial;">）</span><span style="border: 1px windowtext; padding: 0px; background-color: white; background-position: initial initial; background-repeat: initial initial;">也被收录到</span><span style="border: 1px windowtext; padding: 0px; background-color: white; background-position: initial initial; background-repeat: initial initial;">Spring mvc 3.2</span></a><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">中去了</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">。此外，还新增加了对返回</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">(return)</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">，重定向</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">(redirect)</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">和</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">model</span></code><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">等的测试改进，下面是一个例子：</span></code></p><pre style="margin-top: 0px; padding: 0px; color: #333333; font-family: 'Courier New', monospace; font-size: 12px; width: 590.8333740234375px; overflow: auto; background-color: #e6e6e6; line-height: 27.986112594604492px;"><ol style="margin-left: 55px; padding: 5px 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; word-wrap: break-word; word-break: normal; border: none; background-color: #f7f7f7; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 1px !important;"><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">public</span>&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">class</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;SayHelloControllerIT&nbsp;</span><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">extends</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;AbstractTestNGSpringContextTests&nbsp;{&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">private</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;MockMvc&nbsp;mockMvc;&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #646464; background-color: inherit;">@BeforeMethod</span>&nbsp;</span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">public</span>&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">void</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;setUp()&nbsp;{&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;</span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mockMvc&nbsp;=&nbsp;webAppContextSetup((WebApplicationContext)&nbsp;applicationContext).build();&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;</span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #646464; background-color: inherit;">@Test</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">(dataProvider&nbsp;=&nbsp;</span><span style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">"pathParameterAndExpectedModelValue"</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">)&nbsp;</span></span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">public</span>&nbsp;<span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">void</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;accessingSayhelloWithSubpathShouldForwardToSayHelloJspWithModelFilled(String&nbsp;path,&nbsp;String&nbsp;value)&nbsp;</span><span style="margin: 0px; padding: 0px; border: none; color: #006699; background-color: inherit; font-weight: bold;">throws</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">&nbsp;Exception&nbsp;{&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;</span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mockMvc.perform(get(<span style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">"/sayHello/Jo"</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">)).andExpect(view().name(</span><span style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">"sayHello"</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">)).andExpect(model().attribute(</span><span style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">"name"</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">,&nbsp;</span><span style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit;">"Jo"</span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">));&nbsp;</span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; color: inherit; list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li><li style="list-style: none; word-wrap: break-word; word-break: normal; border: none; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-color: transparent; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important; background-position: -498px -70px; background-repeat: no-repeat repeat;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">}&nbsp;</span></li></ol></pre><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;"><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">本文的示例代码可以在</span><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">:</span></code>&nbsp;<a href="http://blog.frankel.ch/wp-content/resources/spring-3-2-sweetness/spring-sweet-1.0.0.zip" _href="http://blog.frankel.ch/wp-content/resources/spring-3-2-sweetness/spring-sweet-1.0.0.zip" style="color: #004276;"><span style="border: 1px windowtext; padding: 0px; background-color: white; background-position: initial initial; background-repeat: initial initial;">http://blog.frankel.ch/wp-content/resources/spring-3-2-sweetness/spring-sweet-1.0.0.zip</span></a><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">中下载。</span></code></p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体; font-size: 14.44444465637207px; line-height: 27.986112594604492px;"><code><span style="border: 1px windowtext; padding: 0px; background-color: white; color: #222222; background-position: initial initial; background-repeat: initial initial;">原文链接：<a href="http://java.dzone.com/articles/spring-32-sweetness" style="color: #004276;">http://java.dzone.com/articles/spring-32-sweetness</a></span></code></p><img src ="http://www.blogjava.net/ldwblog/aggbug/401397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-07-10 11:48 <a href="http://www.blogjava.net/ldwblog/archive/2013/07/10/401397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.5版本中使用注解@Resource/@Antowired问题</title><link>http://www.blogjava.net/ldwblog/archive/2013/03/21/396786.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Thu, 21 Mar 2013 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/03/21/396786.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/396786.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/03/21/396786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/396786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/396786.html</trackback:ping><description><![CDATA[<div>Spring2.5继续坚持了这个发展趋向，特别是为那些使用Java 5或更新版本java的开发人员提供了进一步简化而强大的新特性。这些新特性包括：注解驱动的依赖性注入（annotation-driven dependency injection），使用注解而非XML元数据来自动侦测classpath上的Spring组件，注解对生命周期方法的支持，一个新的web控制器模型将请求映射到加注解的方法上，在测试框架中支持Junit4，Spring XML命名空间的新增内容，等等。</div><div></div><div>项目中使用的spring2.5版本。如果想要使用spring提供的注解功能.</div><div>applicationContext.xml配置文件中增加如下配置:</div><div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</div><div>&lt;beans xmlns="http://www.springframework.org/schema/beans"</div><div><span style="white-space:pre">	</span>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</div><div><span style="white-space:pre">	</span>xmlns:context="http://www.springframework.org/schema/context"</div><div><span style="white-space:pre">	</span>xsi:schemaLocation="http://www.springframework.org/schema/beans&nbsp;</div><div><span style="white-space:pre">	</span>http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&nbsp;</div><div><span style="white-space:pre">	</span>http://www.springframework.org/schema/context</div><div><span style="white-space:pre">	</span>http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;</div><div><span style="white-space:pre">	</span>&lt;!-- Using annontations --&gt;</div><div><span style="white-space:pre">	</span>&lt;context:annotation-config&gt;&lt;/context:annotation-config&gt;</div><div></div><div>新增以下三项才可以使用注解功能<span style="white-space:pre">	</span></div><div>xmlns:context="http://www.springframework.org/schema/context"</div><div>http://www.springframework.org/schema/context</div><div>http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;</div><div>&lt;context:annotation-config&gt;&lt;/context:annotation-config&gt;</div><div>或者&lt;bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/&gt; 注册一个单独的Spring post-processor.</div><div></div><div>一个没有实现任何接口的业务类，配置如下:</div><div>public class LogService extends Service{</div><div></div><div><span style="white-space:pre">	</span>public LogBiz(){}</div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>@Resource //默认按名称查找bean. 如果找不到，则按类型匹配bean.</div><div><span style="white-space:pre">	</span>private BaseDao dao;</div><div><span style="white-space:pre">	</span></div><div>}</div><div>tomcat启动错误1：</div><div>Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'logBiz': Injection of resource fields failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.ccms.base.dao.BaseDAO] is defined: expected single matching bean but found 40: [baseDAO, loginDAO, logDAO]</div><div><span style="white-space:pre">	</span>at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessAfterInstantiation(CommonAnnotationBeanPostProcessor.java:291)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:876)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:437)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)</div><div><span style="white-space:pre">	</span>at java.security.AccessController.doPrivileged(Native Method)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)</div><div><span style="white-space:pre">	</span>... 32 more</div><div>Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.ccms.base.dao.BaseDAO] is defined: expected single matching bean but found 40: [baseDAO, loginDAO, logDAO]</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:583)</div><div><span style="white-space:pre">	</span>at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:418)</div><div><span style="white-space:pre">	</span>at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:497)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:145)</div><div><span style="white-space:pre">	</span>at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:79)</div><div><span style="white-space:pre">	</span>at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessAfterInstantiation(CommonAnnotationBeanPostProcessor.java:288)</div><div><span style="white-space:pre">	</span>... 42 more</div><div>使用@Resource默认按名称查找bean. 如果找不到，则按类型匹配bean.而名称dao没有找到，所以会根据BaseDAO匹配，但是BaseDAO是一个接口：</div><div>&lt;bean id="loginDAO" class="com.test.dao.loginDAO" parent="baseDAO" /&gt;</div><div>&lt;bean id="logDAO" class="com.test.dao.logDAO" parent="baseDAO" /&gt;</div><div>&lt;bean id="baseDAO" class="com.ccms.base.dao.BaseDAOImpl"&gt;</div><div><span style="white-space:pre">		</span>&lt;property name="sessionFactory"&gt;</div><div><span style="white-space:pre">			</span>&lt;ref bean="sessionFactory" /&gt;</div><div><span style="white-space:pre">		</span>&lt;/property&gt;</div><div><span style="white-space:pre">		</span>&lt;property name="simpleJdbcTemplate"&gt;</div><div><span style="white-space:pre">			</span>&lt;ref bean="simpleJdbcTemplate" /&gt;</div><div><span style="white-space:pre">		</span>&lt;/property&gt;</div><div>&lt;/bean&gt;</div><div>有两个实现了BaseDAO接口的类，所以spring就不知道应该使用哪一个了。直接抛出异常。</div><div>解决方法1：</div><div>我们可以看到baseDAO名称是唯一的， 所以如果想要按照名称匹配，则直接写baseDAO就可以了</div><div>@Resource</div><div>private BaseDAO baseDAO;</div><div></div><div>解决方法2：</div><div>@Autowired //默认按照类型匹配，同样应为有两个子类bean，所以抛出异常。</div><div>@Qualifier("loginDAO") //限定bean</div><div>private BaseDAO dao;<br /></div><div><div>参考博客：</div><div>http://doc.chinaunix.net/java/200801/240056.shtml</div><div>http://stackoverflow.com/questions/10534053/autowiring-two-beans-implementing-same-interface-how-to-set-default-bean-to-au</div></div><img src ="http://www.blogjava.net/ldwblog/aggbug/396786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-03-21 10:22 <a href="http://www.blogjava.net/ldwblog/archive/2013/03/21/396786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>目标对象没有实现任何接口，Spring使用CGLIB库生成目标对象的子类</title><link>http://www.blogjava.net/ldwblog/archive/2013/03/05/396081.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Tue, 05 Mar 2013 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/03/05/396081.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/396081.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/03/05/396081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/396081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/396081.html</trackback:ping><description><![CDATA[项目组内一位同事，在重构代码过程中将几个模块的Service层接口去掉后. 修改成了没有实现任何接口的类，并且继承了一个抽象基类。<br />然后我更新代码后执行系统中的该模块，发现部分表数据没有完整持久到数据库中。看了下代码和spring配置文件，原来调整后的Biz的业务类没有配置事务导致的。<br /><div>修改了下spring配置文件（beanNames绑定了*Biz）:</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">=&nbsp;"propertyConfigurer"</span><span style="color: #FF0000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;</span><span style="color: #0000FF; ">=&nbsp;"com.ccms.base.util.DecryptPropertyPlaceholderConfigurer"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="locations"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">=&nbsp;"classpath:sysConfig.properties"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;<br />&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;id="dataSource"&nbsp;class="org.apache.commons.dbcp.BasicDataSource"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destroy-method="close"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="driverClassName"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="url"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;${dataSource.jdbcUrl}&amp;amp;useUnicode=true&amp;amp;characterEncoding=UTF-8&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="username"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;${dataSource.userName}&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="password"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;${dataSource.password}&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="maxActive"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;100&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="initialSize"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;5&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="maxIdle"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;10&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="minIdle"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;0&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="maxWait"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;-1&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="defaultAutoCommit"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;false&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="testOnBorrow"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;true&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="testWhileIdle"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;true&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="timeBetweenEvictionRunsMillis"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;600000&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="numTestsPerEvictionRun"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;20&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="minEvictableIdleTimeMillis"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;3600000&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="dataSource"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="com.mchange.v2.c3p0.ComboPooledDataSource"</span><span style="color: #FF0000; ">&nbsp;destroy-method</span><span style="color: #0000FF; ">="close"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="driverClass"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="com.mysql.jdbc.Driver"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jdbcUrl"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="${dataSource.jdbcUrl}&amp;amp;useUnicode=true&amp;amp;characterEncoding=UTF-8"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="user"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="${dataSource.userName}"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="password"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="${dataSource.password}"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="minPoolSize"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="5"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="maxPoolSize"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="50"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="maxStatements"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="0"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="idleConnectionTestPeriod"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="60"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="acquireRetryAttempts"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="3"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;Session&nbsp;Factory&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<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; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ref&nbsp;</span><span style="color: #FF0000; ">local</span><span style="color: #0000FF; ">="dataSource"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;hbm配置文件的classPath路径&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="mappingDirectoryLocations"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span>classpath:/com/ccms/base/mapping<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="hibernateProperties"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">props</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">prop&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="hibernate.dialect"</span><span style="color: #0000FF; ">&gt;</span>org.hibernate.dialect.MySQLDialect<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">prop</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">prop&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="hibernate.show_sql"</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">prop</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">prop&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="hibernate.generate_statistics"</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">prop</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">prop&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="hibernate.connection.release_mode"</span><span style="color: #0000FF; ">&gt;</span>auto<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">prop</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">prop&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="hibernate.autoReconnect"</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">prop</span><span style="color: #0000FF; ">&gt;</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">prop&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="hibernate.connection.autocommit"</span><span style="color: #0000FF; ">&gt;</span>false<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">prop</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&lt;prop&nbsp;key="hibernate.query.factory_class"&gt;org.hibernate.hql.ast.ASTQueryTranslatorFactory&lt;/prop&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">props</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="myTransactionManager"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.orm.hibernate3.HibernateTransactionManager"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="sessionFactory"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ref&nbsp;</span><span style="color: #FF0000; ">bean</span><span style="color: #0000FF; ">="sessionFactory"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span>&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="transactionInterceptor"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.transaction.interceptor.TransactionInterceptor"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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; ">="myTransactionManager"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">props</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>PROPAGATION_REQUIRED,-Exception<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">prop</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">props</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="transactionInterceptor"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ref</span><span style="color: #0000FF; ">="transactionInterceptor"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span>*Service<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red; background-color: yellow;">&nbsp;&nbsp;</span><span style="color: red; background-color: yellow;">&lt;</span><span style="color: red; background-color: yellow;">value</span><span style="color: red; background-color: yellow;">&gt;</span><span style="color: red; background-color: yellow;">*Biz</span><span style="color: red; background-color: yellow;">&lt;/</span><span style="color: red; background-color: yellow;">value</span><span style="color: red; background-color: yellow;">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span>transactionInterceptor<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div><br />启动tomcat后报出如下错误信息：<br /><div>[2013-03-05 10:36:56] [ERROR] Context initialization failed - at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:215)&nbsp;</div><div>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginBiz' defined in ServletContext resource [/WEB-INF/spring-service-resource.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:445)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)</div><div><span style="white-space: pre;">	</span>at java.security.AccessController.doPrivileged(Native Method)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)</div><div><span style="white-space: pre;">	</span>at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)</div><div><span style="white-space: pre;">	</span>at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)</div><div><span style="white-space: pre;">	</span>at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)</div><div><span style="white-space: pre;">	</span>at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)</div><div><span style="white-space: pre;">	</span>at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardService.start(StandardService.java:519)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.startup.Catalina.start(Catalina.java:581)</div><div><span style="white-space: pre;">	</span>at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)</div><div><span style="white-space: pre;">	</span>at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)</div><div><span style="white-space: pre;">	</span>at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)</div><div><span style="white-space: pre;">	</span>at java.lang.reflect.Method.invoke(Method.java:597)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)</div><div>Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:433)</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:331)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1266)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)</div><div><span style="white-space: pre;">	</span>... 28 more</div><div>Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)</div><div><span style="white-space: pre;">	</span>... 34 more</div><div>2013-3-5 10:36:56 org.apache.catalina.core.StandardContext listenerStart</div><div>严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener</div><div>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginBiz' defined in ServletContext resource [/WEB-INF/spring-service-resource.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:445)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)</div><div><span style="white-space: pre;">	</span>at java.security.AccessController.doPrivileged(Native Method)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)</div><div><span style="white-space: pre;">	</span>at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)</div><div><span style="white-space: pre;">	</span>at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)</div><div><span style="white-space: pre;">	</span>at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)</div><div><span style="white-space: pre;">	</span>at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)</div><div><span style="white-space: pre;">	</span>at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardService.start(StandardService.java:519)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.startup.Catalina.start(Catalina.java:581)</div><div><span style="white-space: pre;">	</span>at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)</div><div><span style="white-space: pre;">	</span>at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)</div><div><span style="white-space: pre;">	</span>at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)</div><div><span style="white-space: pre;">	</span>at java.lang.reflect.Method.invoke(Method.java:597)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)</div><div><span style="white-space: pre;">	</span>at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)</div><div>Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.ccms.login.LoginBiz]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:433)</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:331)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1266)</div><div><span style="white-space: pre;">	</span>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)</div><div><span style="white-space: pre;">	</span>... 28 more</div><div>Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)</div><div><span style="white-space: pre;">	</span>at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)</div><div><span style="white-space: pre;">	</span>at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)</div><div><span style="white-space: pre;">	</span>... 34 more</div><div>2013-3-5 10:36:56 org.apache.catalina.core.StandardContext start</div><div><br />------------------------------------------</div>通过以上错误分析之：<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">对于实现了接口的类，直接用了JDK的动态代理，把目标对象扔给JDK的Proxy，拿到代理对象就OK了。</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">然而对于没有实现接口的类，Spring借助于CGLIB来实现代理。<br />解决办法：<br /></span>当使用CGLIB来实现代理后，没有实现接口的类<br />1、 通过构造函数形式注入时必须有默认的构造函数，否则就会出现上面的异常。<br />2、通过生产setter或者getter方法注入。<br />3、通过修改Spring的<span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; font-size: 12px; line-height: 18px; background-color: #fafafa;">CglibProxyFactory工厂类。<br /><br /></span>详细解析可以参照这篇文章：<a href="http://netfork.iteye.com/blog/286215">http://netfork.iteye.com/blog/286215</a><img src ="http://www.blogjava.net/ldwblog/aggbug/396081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-03-05 14:54 <a href="http://www.blogjava.net/ldwblog/archive/2013/03/05/396081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring使用Quartz调度器 实现时间点任务(Spring in Action中文版) </title><link>http://www.blogjava.net/ldwblog/archive/2011/09/14/358587.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 14 Sep 2011 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2011/09/14/358587.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/358587.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2011/09/14/358587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/358587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/358587.html</trackback:ping><description><![CDATA[转载自<a href="http://chorpin.iteye.com/blog/157992">http://chorpin.iteye.com/blog/157992</a> <br /><br /><a href="http://www.quartz-scheduler.org/documentation">http://www.quartz-scheduler.org/documentation</a><br /><br />
<div class="blog_content" id="blog_content">7.3.2&nbsp; 使用Quartz调度器 <br />Quartz调度器为调度工作提供了更丰富的支持。和Java定时器一样，可以使用Quartz来每隔多少毫秒执行一个工作。但Quartz比Java Timer更先进之处在于它允许你调度一个工作在某个特定的时间或日期执行。 <br /><br />关于Quartz的更多信息，可以访问Quartz位于http://www.opensymphony.com/quartz的主页。 <br /><br />让我们从定义发送报表邮件的工作开始使用Quartz： <br /><br />创建一个工作 <br />定义Quartz工作的第一步是创建一个类来定义工作。要做到这一点，你需要从Spring的QuartzJobBean中派生子类，如程序清单7.3所示： <br /><br />　程序清单7.3&nbsp; 定义一个Quartz工作 <br />&nbsp; public class EmailReportJob extends QuartzJobBean { <br />&nbsp;&nbsp;&nbsp; public EmailReportJob() {} <br />&nbsp;&nbsp;&nbsp; protected void executeInternal(JobExecutionContext context) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws JobExecutionException { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; courseService.sendCourseEnrollmentReport(); <br />&nbsp;&nbsp;&nbsp; } <br /><br />&nbsp;&nbsp;&nbsp; private CourseService courseService; <br />&nbsp;&nbsp;&nbsp; public void setCourseService(CourseService courseService) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.courseService = courseService; <br />&nbsp;&nbsp;&nbsp; } <br />&nbsp; } <br /><br />QuartzJobBean是Quartz中与Java的TimerTask等价的类。它实现了org.quartz.Job接口。executeInternal()方法定义了当预定的时刻来临时应该执行哪些动作。在这里，正如EmailReportTask，你只是简单地调用了courseService属性的sendCourseEnrollmentReport()方法。 <br /><br />在Spring配置文件中按以下方式声明这个工作： <br />&nbsp; &lt;bean id="reportJob" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.scheduling.quartz.JobDetailBean"&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="jobClass"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com.springinaction.training. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; schedule.EmailReportJob&lt;/value&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="jobDataAsMap"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;map&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry key="courseService"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="courseService"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/map&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp; &lt;/bean&gt; <br /><br />值得注意的是，在这里你并没有直接声明一个EmailReportJob Bean，而是声明了一个JobDetailBean。这是使用Quartz时的一个特点。JobDetailBean是Quartz的org.quartz.JobDetail的子类，它要求通过jobClass属性来设置一个Job对象。 <br /><br />使用Quartz的JobDetail中的另一个特别之处是EmailReportJob的courseService属性是间接设置的。JobDetail的jobDataAsMap属性接受一个java.util.Map，其中包含了需要设置给jobClass的各种属性。在这里，这个map包含了一个指向courseService Bean的引用，它的键值为courseService。当JobDetailBean实例化时，它会将courseService Bean注入到EmailReportJob的courseService属性中。 <br /><br />调度工作 <br />现在工作已经被定义好了，接下来你需要调度这个工作。Quartz的org.quartz.Trigger类描述了何时及以怎样的频度运行一个Quartz工作。Spring提供了两个触发器，SimpleTriggerBean和CronTriggerBean。你应该使用哪个触发器？让我们分别考察一下这两个触发器，首先从SimpleTriggerBean开始。 <br /><br />SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工作应该以怎样的频度运行，以及（可选地）在第一次运行工作之前应该等待多久。例如，要调度报表工作每24小时运行一次，第一次在1小时之后开始运行，可以按照以下方式进行声明： <br /><br />&nbsp; &lt;bean id="simpleReportTrigger"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.scheduling.quartz.SimpleTriggerBean"&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="jobDetail"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="reportJob"/&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="startDelay"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;3600000&lt;/value&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="repeatInterval"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;86400000&lt;/value&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp; &lt;/bean&gt; <br /><br />属性jobDetail装配了将要被调度的工作，在这个例子中是reportJob Bean。属性repeatInterval告诉触发器以怎样的频度运行这个工作（以毫秒作为单位）。这里，我们设置它为86400000，因此每隔24小时它会被触发一次。你也可以选择设置startDelay属性来延迟工作的第一次执行。我们设置它为3600000，因此在第一次触发之前它会等待1小时。 <br /><br />调度一个cron工作 <br />尽管你可能认为SimpleTriggerBean适用于大多数应用，但它仍然不能满足发送注册报表邮件的需求。正如ScheduledTimerTask，你只能指定工作执行的频度，而不能准确指定它于何时运行。因此，你无法使用SimpleTriggerBean在每天早晨6:00给课程主任发送注册报表邮件。 <br /><br />然而，CronTriggerBean允许你更精确地控制任务的运行时间。如果你对Unix的cron工具很熟悉，则会觉得CronTriggerBean很亲切。你不是定义工作的执行频度，而是指定工作的准确运行时间（和日期）。例如，要在每天早上6:00运行报表工作，可以按照以下方式声明一个CronTriggerBean： <br /><br />&nbsp; &lt;bean id="cronReportTrigger" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.scheduling.quartz.CronTriggerBean"&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="jobDetail"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="reportJob"/&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="cronExpression"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;0 0 6 * * ?&lt;/value&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp; &lt;/bean&gt; <br /><br />和SimpleTriggerBean一样，jobDetail属性告诉触发器调度哪个工作。这里我们又一次装配了一个reportJob Bean。属性cronExpression告诉触发器何时触发。如果你不熟悉cron，这个属性可能看上去有点神秘，因此让我们进一步考察一下这个属性。 <br /><br />一个cron表达式有至少6个（也可能是7个）由空格分隔的时间元素。从左至右，这些元素的定义如下： <br /><br />1．秒（0&#8211;59） <br /><br />2．分钟（0&#8211;59） <br /><br />3．小时（0&#8211;23） <br /><br />4．月份中的日期（1&#8211;31） <br /><br />5．月份（1&#8211;12或JAN&#8211;DEC） <br /><br />6．星期中的日期（1&#8211;7或SUN&#8211;SAT） <br /><br />7．年份（1970&#8211;2099） <br /><br />每一个元素都可以显式地规定一个值（如6），一个区间（如9-12），一个列表（如9，11，13）或一个通配符（如*）。&#8220;月份中的日期&#8221;和&#8220;星期中的日期&#8221;这两个元素是互斥的，因此应该通过设置一个问号（？）来表明你不想设置的那个字段。表7.1中显示了一些cron表达式的例子和它们的意义： <br /><br />表7.1&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; 一些cron表达式的例子 <br /><br />表&nbsp; 达&nbsp; 式 <br />意&nbsp;&nbsp;&nbsp; 义 <br /><br />0 0 10,14,16 * * ? <br />每天上午10点，下午2点和下午4点 <br />0 0,15,30,45 * 1-10 * ? <br />每月前10天每隔15分钟 <br />30 0 0 1 1 ? 2012 <br />在2012年1月1日午夜过30秒时 <br />0 0 8-5 ? * MON-FRI <br />每个工作日的工作时间 <br /><br />对于cronReportTrigger，我们设置cronExpression为0 0 6 * * ?可以把它读作&#8220;在任何月份任何日期（不管是星期几）的6时0分0秒执行触发器。&#8221;换句话说，这个触发器会在每天早晨6:00执行。 <br />使用CronTriggerBean完全能够满足课程主任的期望了。现在剩下要做的只是启动这个工作了。 <br />启动工作 <br />Spring的SchedulerFactoryBean是Quartz中与TimerFactoryBean等价的类。按照如下方式在Spring配置文件中声明它： <br />&nbsp; &lt;bean class="org.springframework.scheduling. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; quartz.SchedulerFactoryBean"&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="triggers"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="cronReportTrigger"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp; &lt;/bean&gt; <br /><br />属性triggers接受一组触发器。由于目前只有一个触发器，因此只需简单地装配一个包含cronReportTrigger Bean的一个引用的列表即可。 <br />现在，你已经实现了调度发送注册报表邮件的需求。但在这个过程中，你做了一些额外的工作。在开始新的话题之前，首先让我们看一下如何通过更简单一些的方式调度报表邮件。 <br /><br />示例配置： <br />&lt;beans&gt; <br />&lt;bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt; <br />&lt;property name="triggers"&gt; <br />&lt;list&gt; <br />&lt;!--ref local="SocketJobTrigger"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="RouteJobTrigger"/--&gt; <br />&lt;/list&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;!----&gt; <br />&lt;bean id="SocketJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"&gt; <br />&lt;property name="jobDetail"&gt; <br />&lt;ref bean="SocketJobDetail"/&gt; <br />&lt;/property&gt; <br />&lt;property name="startDelay"&gt; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;value&gt;10000&lt;/value&gt; <br />&nbsp; &lt;/property&gt; <br />&nbsp; &lt;property name="repeatInterval"&gt; <br />&nbsp;&nbsp;&nbsp; &lt;!-- repeat every 2 minutes --&gt; <br />&nbsp;&nbsp;&nbsp; &lt;value&gt;120000&lt;/value&gt; <br />&nbsp; &lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;bean id="SocketJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt; <br />&lt;property name="targetObject"&gt; <br />&lt;ref local="quartzManager"/&gt; <br />&lt;/property&gt; <br />&lt;property name="targetMethod"&gt; <br />&lt;value&gt;useQuartz&lt;/value&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt; <br /><br />&lt;bean id="socketManager" class="com.lxh.bean.quartzManager"&gt; <br />&lt;/bean&gt; <br />&lt;!----&gt; <br />&lt;bean id="RouteJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"&gt; <br />&lt;property name="jobDetail"&gt; <br />&lt;ref bean="RouteJobDetail"/&gt; <br />&lt;/property&gt; <br />&lt;property name="startDelay"&gt; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;value&gt;30000&lt;/value&gt; <br />&nbsp; &lt;/property&gt; <br />&nbsp; &lt;property name="repeatInterval"&gt; <br />&nbsp;&nbsp;&nbsp; &lt;value&gt;30000&lt;/value&gt; <br />&nbsp; &lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;bean id="RouteJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt; <br />&lt;property name="targetObject"&gt; <br />&lt;ref local="otherManager"/&gt; <br />&lt;/property&gt; <br />&lt;property name="targetMethod"&gt; <br />&lt;value&gt;otherQuartz&lt;/value&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt; <br /><br />&lt;bean id="routeManager" class="com.lxh.job.otherManager"&gt; <br />&lt;/bean&gt; <br />&lt;/beans&gt; </div><script type="text/javascript"><!--
google_ad_client = "pub-1076724771190722";
/* JE个人博客468x60 */
google_ad_slot = "5506163105";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/js/r20110831/r20110719/show_ads_impl.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script><img src ="http://www.blogjava.net/ldwblog/aggbug/358587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2011-09-14 10:19 <a href="http://www.blogjava.net/ldwblog/archive/2011/09/14/358587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring创始人Rod Johnson就加盟VMware一事表示兴奋</title><link>http://www.blogjava.net/ldwblog/archive/2011/08/22/357043.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 22 Aug 2011 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2011/08/22/357043.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/357043.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2011/08/22/357043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/357043.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/357043.html</trackback:ping><description><![CDATA[<div style="text-indent: 28px;"><span class="Apple-style-span" style="color: #333333; font-family: 宋体; line-height: 28px; ">转载自：</span><span class="Apple-style-span" style="color: #333333; font-family: 宋体; line-height: 28px; ">&nbsp;&nbsp;<a href="http://developer.51cto.com/art/200908/143288.htm">http://developer.51cto.com/art/200908/143288.htm</a></span></div><span class="Apple-style-span" style="color: #333333; font-family: 宋体; line-height: 28px; "><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><br /></p></span><span class="Apple-style-span" style="color: #333333; font-family: 宋体; line-height: 28px; "><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><a href="http://developer.51cto.com/art/200908/143265.htm" style="color: #004276; text-decoration: underline; ">VMware斥资4.2亿美元收购SpringSource</a>（3.6亿现金外加5800万股份），目的在于从虚拟化厂商升级为云计算的重要参与者。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">VMware的CTOSteve Herrod称VMware的vSphere云管理平台与Spring Java应用框架等工具的结合将会大大节省开发者编写部署应用所花费的时间精力。此举将提升VMware在PaaS上的竞争能力。PaaS上的几大竞争者包括Salesforce.com的Force.com，以及Google App Engine。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">Rod Johnson在SpringSource官方博客上公布这一消息时声称收购将于今年第三季度完成，届时SpringSource将成为VMware下属的一个部门，而他将仍是SpringSource的领导者。<strong style="font-weight: bold; text-align: center; ">以下是Rod Johnson对此次收购的展望：</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#8220;此次决定是很自然而符合逻辑的：这将带来更多的新技术，并且对Spring框架以及Spring社区都有好处。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">我很兴奋</strong>。希望你也是。这将极其有趣。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#8230;&#8230;Spring框架将继续提供优质的企业级Java支持。我们从关注开发者如何创建和使用应用，到关注他们如何部署和运行企业级应用；为此我们创建了dm Server和tc Server。我们<a href="http://developer.51cto.com/art/200905/122352.htm" style="color: #004276; text-decoration: underline; ">收购Hyperic</a>也是为了改善开发者管理企业级应用的方法。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">然而IT的发展要远远超过Java框架，工具以及运行时基础设施。人们对于软件堆栈的想法正在改变。虚拟化改变了数据中心，而云计算又将走的更远。云计算将开发与操作的界限模糊化，并赋予开发者更多的力量（与责任）。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">现在的问题就是，如何将SpringSource在数据中心和云计算中的潜力：它的简单，强大和实用这些好处最大化？我们今年早些时候曾尝试过在VMware的Lab Manager下的虚拟机中运行SpringSource Tool Suite中的Spring应用。这次范例的反响很好。而VMware的vApp concept又能够将不同的机器映像，中间件以及管理控件结合到一起&#8212;&#8212;点击一下，就能在数据中心和云端运行，这都是很好的蓝图。</p><p align="center" style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><a href="http://images.51cto.com/files/uploadimg/20090811/134244490.jpg" target="_blank" style="color: #004276; text-decoration: underline; "><img class="fit-image" height="314" alt="创建-运行-管理" src="http://images.51cto.com/files/uploadimg/20090811/134244490.jpg" width="494" border="0" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-color: initial; text-align: center; border-style: initial; border-color: initial; " /></a>&nbsp;</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">与VMware的合作中，我们计划创建一个简单，集成，创建-运行-管理合一的数据中心、私有云和公共云的解决方案。这个方案将融合应用架构的知识，连带中间件以及管理控件，确保一个虚拟环境在部署过程中以及运行时的最大效率及弹性。这是一个PaaS，建立在你已知的技术之上，从而最大的减少花费与复杂度。这是一个围绕开源、可移植的中间件技术的解决方案，既可以在传统数据中心的Java EE应用服务器上运行，又可以在如Amazon EC2之类的弹性云上运行，也可以在VMware平台上运行。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#8230;&#8230;与VMware的vSphere以及其他云技术一起，我们将在框架和基础设施上带来一个全新的体验。SpringSource的应用框架、服务器及管理软件将成为VMware平台的眼睛和耳朵。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#8230;&#8230;SpringSource的下一步工作将是这些新的挑战：基于我们的Build/Run/Manage（创建运行管理）系统，提供从桌面端到云端的最佳解决方案。让百万Java开发者都能享受到云计算带来的好处。&#8221;</p></span><br /><a href="http://developer.51cto.com/art/200908/143288.htm"></a><img src ="http://www.blogjava.net/ldwblog/aggbug/357043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2011-08-22 15:09 <a href="http://www.blogjava.net/ldwblog/archive/2011/08/22/357043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>