﻿<?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-xmatthew-随笔分类-Spring|Hibernate|Other framework</title><link>http://www.blogjava.net/xmatthew/category/35679.html</link><description>孤独键盘手</description><language>zh-cn</language><lastBuildDate>Fri, 09 Apr 2021 10:37:01 GMT</lastBuildDate><pubDate>Fri, 09 Apr 2021 10:37:01 GMT</pubDate><ttl>60</ttl><item><title>兼容原生SpringBoot配置规范， BRCC助你一站式解决项目配置建设需求</title><link>http://www.blogjava.net/xmatthew/archive/2021/04/08/435848.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 08 Apr 2021 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2021/04/08/435848.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/435848.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2021/04/08/435848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/435848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/435848.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.&nbsp;Springboot config示例与原理介绍1.1 Springboot config示例Springboot给我们提供了非常便捷与方便的配置使用方式，常用的使用示例有以下两种：1）使用@ConfigurationProperties 读取多个属性使用方法：@ConfigurationProperties(prefix = "spring.datasource")使用说明：提供...&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2021/04/08/435848.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/435848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2021-04-08 20:00 <a href="http://www.blogjava.net/xmatthew/archive/2021/04/08/435848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jprotobuf-rpc-http组件库1.0发布，可支持直接把Protobuf IDL定义发布成RPC服务应用</title><link>http://www.blogjava.net/xmatthew/archive/2014/10/10/418592.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Fri, 10 Oct 2014 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2014/10/10/418592.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/418592.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2014/10/10/418592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/418592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/418592.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: jprotobuf-rpc-http 是应用jprotobuf类库实现基于http协议的RPC开发组件。 目前1.0提供可以直接把Google protobuf的IDL定义语言发布成RPC服务，客户端也可以直接应用IDL定义语言进行动态创建，帮助开发完全省去了手工编译protobuf IDL语言的麻烦。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2014/10/10/418592.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/418592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2014-10-10 15:20 <a href="http://www.blogjava.net/xmatthew/archive/2014/10/10/418592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mybatis Laz-Load功能实现代码赏析(原创)</title><link>http://www.blogjava.net/xmatthew/archive/2011/12/29/367523.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 29 Dec 2011 11:14:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2011/12/29/367523.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/367523.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2011/12/29/367523.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/367523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/367523.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 对于Mybatis 拥有的Lazy Load(有中文翻译成延迟加载)功能，应该很同学都有听说过，今天主要与大家一起来解读一下Mybatis在Lazy Load功能的实现的代码。Lazy Load实现的功能很好理解，就是在数据与对象进行Mapping操作时，只有当真正使用该对象时，才进行Mapping操作，以减少不必要的数据库查询开销,从而提升了程序的效率。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2011/12/29/367523.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/367523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2011-12-29 19:14 <a href="http://www.blogjava.net/xmatthew/archive/2011/12/29/367523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>源码解读Mybatis List列表In查询实现的注意事项</title><link>http://www.blogjava.net/xmatthew/archive/2011/08/31/355879.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Wed, 31 Aug 2011 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2011/08/31/355879.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/355879.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2011/08/31/355879.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/355879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/355879.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在SQL开发过程中，动态构建In集合条件查询是比较常见的用法，在Mybatis中提供了foreach功能，该功能比较强大，但由于官方文档对这块的使用，描述的比较简短，细节上也被忽略掉了(可能是开源项目文档一贯的问题吧)，也使用不少同学在使用中遇到了问题。特别是foreach这个函数中，collection属性做什么用，有什么注意事项。由于文档不全，这块只能通过源代码剖析的方式来分析一下各个属性的相关要求。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2011/08/31/355879.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/355879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2011-08-31 14:38 <a href="http://www.blogjava.net/xmatthew/archive/2011/08/31/355879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring声明式事务配置详解</title><link>http://www.blogjava.net/xmatthew/archive/2011/06/23/352871.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 23 Jun 2011 05:25:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2011/06/23/352871.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/352871.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2011/06/23/352871.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/352871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/352871.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring声明式事务功能应该是大家应用Spring中使用的最多的功能之一了，的确该功能极大的简化了大家对数据库操作的。目前Spring支持的声明式事务有两个配置方式，一种是XML配置方式，另一种是注解方式<br><br>针对配置这块，XML配置同学们会觉得比较麻烦，特别是针对事务属性的配置，所以补充一下本块配置说明，特分享给大家，希望对大家有帮助。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2011/06/23/352871.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/352871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2011-06-23 13:25 <a href="http://www.blogjava.net/xmatthew/archive/2011/06/23/352871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.x框架学习(连载)-了解AOP</title><link>http://www.blogjava.net/xmatthew/archive/2011/04/01/347448.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Fri, 01 Apr 2011 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2011/04/01/347448.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/347448.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2011/04/01/347448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/347448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/347448.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理，声明性事务管理，AOP管理，注解应用实现，以及在其上面进行扩展的相关应用。<br><br>本篇技术文章介绍Spring AOP的实现。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2011/04/01/347448.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/347448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2011-04-01 10:52 <a href="http://www.blogjava.net/xmatthew/archive/2011/04/01/347448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.x框架学习(连载)-了解Spring基础</title><link>http://www.blogjava.net/xmatthew/archive/2011/03/14/346261.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Mon, 14 Mar 2011 11:24:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2011/03/14/346261.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/346261.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2011/03/14/346261.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/346261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/346261.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本块文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理，声明性事务管理，AOP管理，注解应用实现，以及在其上面进行扩展的相关应用进行介绍。<br><br>本篇技术文章将作为Spring入门篇。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2011/03/14/346261.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/346261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2011-03-14 19:24 <a href="http://www.blogjava.net/xmatthew/archive/2011/03/14/346261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 单元测试方案</title><link>http://www.blogjava.net/xmatthew/archive/2011/02/27/338714.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Sun, 27 Feb 2011 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2011/02/27/338714.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/338714.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2011/02/27/338714.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/338714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/338714.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文是针对 之前的通过Spring2.5对单元测试的Annotation支持进行TDD开发 进行扩展，增加了Struts Action层的测试实现。虽然Action没有注入到Spring容器，也可以通过 getProxyAction方法，实现Spring容器的属性依赖注入实现&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2011/02/27/338714.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/338714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2011-02-27 19:15 <a href="http://www.blogjava.net/xmatthew/archive/2011/02/27/338714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate envers开发指南</title><link>http://www.blogjava.net/xmatthew/archive/2010/08/22/329521.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Sun, 22 Aug 2010 15:20:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2010/08/22/329521.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/329521.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2010/08/22/329521.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/329521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/329521.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 介绍:<br>Hibernate Envers目的是根据对实体的设置，提供记录执行数据变更历史的功能(数据变更版本)。它实现原理是通过对Hibernate的操作事件监听并根据<br>基于Annoatation的配置来记录修改数据的内容。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2010/08/22/329521.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/329521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2010-08-22 23:20 <a href="http://www.blogjava.net/xmatthew/archive/2010/08/22/329521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>源代码解读基于Spring的声明性缓存实现原理</title><link>http://www.blogjava.net/xmatthew/archive/2010/05/13/320915.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 13 May 2010 11:53:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2010/05/13/320915.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/320915.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2010/05/13/320915.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/320915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/320915.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上篇博客中，介绍了如何借助Spring Module项目，配置声明式缓存功能实现，文中只针对Ehcahce的实现进行了讲解，其它Spring Module项目把这块的功能做了一个很好的抽取，使其能更好的对其它的缓存框架的支持和扩展。笔者正好利用该代码框架实现了与Memcached服务的集成，本文将得点通过源代码解讲一下抽取这层的实现，希望大家有所帮助。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2010/05/13/320915.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/320915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2010-05-13 19:53 <a href="http://www.blogjava.net/xmatthew/archive/2010/05/13/320915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>源代码解读Spring只读事务与读写事务的性能的差别</title><link>http://www.blogjava.net/xmatthew/archive/2010/05/06/320123.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 06 May 2010 11:31:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2010/05/06/320123.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/320123.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2010/05/06/320123.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/320123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/320123.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前言：<br>  如果大家使用过Spring事务管理，会发现Spring提供的事务分为“只读”和“读写”事务两类。这不免就会疑问这两种事务会有什么不同？本文则通过对Spring和Hibernate源代码的剖析来找出这两种事务的区别。特别是运行性能方面的区别。<br>  文章调试使用的版本为 Spring 2.5.6.SEC01 ，Hibernate 3.3.2.GA。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2010/05/06/320123.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/320123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2010-05-06 19:31 <a href="http://www.blogjava.net/xmatthew/archive/2010/05/06/320123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>借助Spring Module项目，如何配置声明式缓存功能实现</title><link>http://www.blogjava.net/xmatthew/archive/2010/04/22/319146.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 22 Apr 2010 11:47:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2010/04/22/319146.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/319146.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2010/04/22/319146.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/319146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/319146.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前言：<br>  本文档将讲解一下，如何借助Spring Module项目，实现配置声明性缓存功能。<br>说明:<br>  本档的配置经过本人测试，都能正确运行。<br>  运行环境： Jdk5.0, Spring-2.5, Spring-modules-0.9， ehcache-1.6.0-beta4.jar&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2010/04/22/319146.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/319146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2010-04-22 19:47 <a href="http://www.blogjava.net/xmatthew/archive/2010/04/22/319146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 3.0 M2发布, 大部分新特性已经开发完成</title><link>http://www.blogjava.net/xmatthew/archive/2009/02/27/257091.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Fri, 27 Feb 2009 13:10:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2009/02/27/257091.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/257091.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2009/02/27/257091.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/257091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/257091.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  期待这么长时间，终于在SpringSource官方网站发布了M2版本，大部分新特性已经开发完成<br><br>    * 从Spring3.0开始，就只支持java 5及以上的版本。开始泛型的支持，M2版本中的HibernateTemplate已经实现了泛型的支持。<br>    * 扩展了对并发的支持。M2版本将对java 5的 java.util.concurrent 类库进行更紧密的集成。在将来的Spring 3.0 M3版本会更进一步对配置进行简单，以方便使用。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2009/02/27/257091.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/257091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2009-02-27 21:10 <a href="http://www.blogjava.net/xmatthew/archive/2009/02/27/257091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Integration 1.0 正式发布</title><link>http://www.blogjava.net/xmatthew/archive/2008/12/04/243443.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 04 Dec 2008 00:33:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/12/04/243443.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/243443.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/12/04/243443.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/243443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/243443.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:    期待了许久，终于等到Spring Integration 1.0的正式发布。在些先祝贺一了Spring Source公司和Spring integration团队。<br>   下面是本人争取第一时整理的学习笔记(针对最新版本)&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/12/04/243443.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/243443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-12-04 08:33 <a href="http://www.blogjava.net/xmatthew/archive/2008/12/04/243443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Integration 1.0学习笔记(二)</title><link>http://www.blogjava.net/xmatthew/archive/2008/12/04/243455.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 04 Dec 2008 00:33:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/12/04/243455.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/243455.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/12/04/243455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/243455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/243455.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前一部分，通过XML的使用方式讲解了The Cafe Sample(小卖部订餐例子)<br>本笔记接下讲解以Annotation的方式来使用Spring-integration的例子。还是之前的那个示例:<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/12/04/243455.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/243455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-12-04 08:33 <a href="http://www.blogjava.net/xmatthew/archive/2008/12/04/243455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>What is Spring?</title><link>http://www.blogjava.net/xmatthew/archive/2008/12/01/243801.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Mon, 01 Dec 2008 14:04:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/12/01/243801.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/243801.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/12/01/243801.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/243801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/243801.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  应该使用过Spring的人都被问题过这个问题， What is Spring?(当然不能回答春天了，呵呵)<br> <br> 其实在Spring官方网站就是具体的介绍，下面本人对其译成了中文.如有翻译不当之处，敬请各位指正。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/12/01/243801.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/243801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-12-01 22:04 <a href="http://www.blogjava.net/xmatthew/archive/2008/12/01/243801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss Envers 学习笔记 </title><link>http://www.blogjava.net/xmatthew/archive/2008/11/14/238432.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Fri, 14 Nov 2008 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/11/14/238432.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/238432.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/11/14/238432.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/238432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/238432.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:      试用JBoss Envers项目有一阵子了，趁项目发布 1.1.0版，也同时把学习笔记共享给大家，希望对大家有所帮助。<br>     JBoss Envers目的是根据对实体的设置，提供记录执行数据变更历史的功能(数据变更版本)。Envers的配置非常简单，如果需要对某个实例进行历史数据版本记录，只需要在实例上配置@Versioned annotation即可。针对每个实体的版本的历史数据,Envers都会创建一个单独的数据表进行存储。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/11/14/238432.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/238432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-11-14 12:14 <a href="http://www.blogjava.net/xmatthew/archive/2008/11/14/238432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Integration 1.0 RC1 版本发布 </title><link>http://www.blogjava.net/xmatthew/archive/2008/11/08/239395.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Sat, 08 Nov 2008 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/11/08/239395.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/239395.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/11/08/239395.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/239395.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/239395.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 期待了许久，终于等到Spring Integration 1.0的 RC1版本。相对于Spring的其它项目，Spring Integration项目的推进速度的确是比较慢。由于本人对EIP这一块的情有独钟，所以对这一块也是一直追踪着。RC1版本的发布，也代表着1.0 的正式也临近发布了，请我们期待吧。<br>   下面是本人先前整理的学习笔记(目前只针对M6版本，RC1版有一些改动，正在整理中)&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/11/08/239395.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/239395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-11-08 12:53 <a href="http://www.blogjava.net/xmatthew/archive/2008/11/08/239395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.5.6正式发布</title><link>http://www.blogjava.net/xmatthew/archive/2008/11/06/238971.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Thu, 06 Nov 2008 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/11/06/238971.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/238971.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/11/06/238971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/238971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/238971.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 期待了四个多月的Spring 2.5.6版本终于正式发布了，官网信息.<br><br>按照官方3.0版本开发的说明，Spring 2.5.6将会是Spring 2.5分支的最后一个版，整个开发团队将会全力投入到 3.0版本的开发工作。3.0版的MVC将会对Rest进行支持。<br>Spring 3.0 is in progress now! view roadmap click here&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/11/06/238971.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/238971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-11-06 10:25 <a href="http://www.blogjava.net/xmatthew/archive/2008/11/06/238971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过Spring2.5对单元测试的Annotation支持进行TDD开发</title><link>http://www.blogjava.net/xmatthew/archive/2008/11/05/238697.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Wed, 05 Nov 2008 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/11/05/238697.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/238697.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/11/05/238697.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/238697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/238697.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文从一个例子出发，根据TDD(测试驱动开发)要求，进行开发。只是用于演示如何使用Spring2.5提供的基于Annonation方式的IOC实现，进行TDD开发。<br><br>首先我们来看一下这个例子的要求:<br>  开发一个购物车对象,可以添加商品，删除商品，查询已购商口，结账功能。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/11/05/238697.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/238697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-11-05 19:40 <a href="http://www.blogjava.net/xmatthew/archive/2008/11/05/238697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>﻿Spring2 提供的remote包学习笔记</title><link>http://www.blogjava.net/xmatthew/archive/2008/11/02/238208.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Sun, 02 Nov 2008 11:20:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/11/02/238208.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/238208.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/11/02/238208.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/238208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/238208.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring2 针对远程访问服务，提供的一个remote包。其的的是提供一套统一的远程服务发布功能。<br>Spring2支持远程服务功能如下:<br>	1. RMI服务 <br>	2. Hessian或者Burlap通过HTTP远程调用服务 <br>	3. HTTP调用器暴露服务 <br>本文结合源码示例，来讲解如何实现这些功能发布。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/11/02/238208.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/238208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-11-02 19:20 <a href="http://www.blogjava.net/xmatthew/archive/2008/11/02/238208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate配置文件中几种实现数据库连接方式的配置方法</title><link>http://www.blogjava.net/xmatthew/archive/2008/10/19/235332.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Sun, 19 Oct 2008 13:19:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/10/19/235332.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/235332.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/10/19/235332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/235332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/235332.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;参读了Hibernate的源代码后，整理了一下Hibernate配置文件中几种实现数据库连接方式的配置方法。(共四个方式)<br />
&nbsp;&nbsp; 1.&nbsp;程序内部启动 c3p0 连接池。<br />
&nbsp;&nbsp; 配置方式如下:连接池的支持(注：需要c3p0的类库支持) <br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.driver_class"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="org.postgresql.Driver"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.url"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="jdbc:postgresql://xxxxx/xxxx"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.username"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="xxxxx"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.password"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="xxxx"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.c3p0.min_size"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: rgb(0, 0, 255);">="5"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.c3p0.max_size"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: rgb(0, 0, 255);">="20"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.c3p0.timeout"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: rgb(0, 0, 255);">="300"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.c3p0.max_statements"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: rgb(0, 0, 255);">="50"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.c3p0.idle_test_period"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: rgb(0, 0, 255);">="3000"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; <br />
</span></div>
&nbsp;&nbsp; 注： Hibernate根据 hibernate.c3p0.max_size 这个配置来识别是支持c3p0连接池<br />
<br />
&nbsp;&nbsp; 2. 引用外部连接池&nbsp;&nbsp;&nbsp; (通过JNDI查找 DataSource资料)<br />
&nbsp;&nbsp; 需要配置方式如下:<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.datasource"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="java:comp/env/jdbc/qualitydb"</span><span style="color: rgb(0, 0, 255);">/&gt;</span></div>
<br />
&nbsp;&nbsp; 3. 通过 org.hibernate.connection.ProxoolConnectionProvider 创建<br />
&nbsp;&nbsp;&nbsp; 由 <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; hibernate.proxool.xml<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; hibernate.proxool.properties<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; hibernate.proxool.existing_pool 三个配置一起来确定<br />
<br />
&nbsp;&nbsp; 4.&nbsp; DriverManager 创建直接连接方式<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.driver_class"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="org.postgresql.Driver"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.url"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="jdbc:postgresql://xxxxx/xxxx"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.username"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="xxxxx"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernate.connection.password"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="xxxx"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span></div>
&nbsp;&nbsp;&nbsp; 注： Hibernate根据 hibernate.connection.url这个来识别,由于在识别时，c3p0的优先级会高于DriverManger所以，与c3p0的配置不会冲突<br />
<br />
<br />
Good Luck!<br />
Yours Matthew!<br />
<img src ="http://www.blogjava.net/xmatthew/aggbug/235332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-10-19 21:19 <a href="http://www.blogjava.net/xmatthew/archive/2008/10/19/235332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>源代码解读Spring+Hibernate(JPA)的LazyLoadException异常</title><link>http://www.blogjava.net/xmatthew/archive/2008/10/11/233769.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Sat, 11 Oct 2008 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/10/11/233769.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/233769.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/10/11/233769.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/233769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/233769.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp; 好久的笔记了，趁刚好休息整理文档，翻出这一部分，稍加整理后，就发上来给大家共享一下，希望对各位有所帮助。<br />
<br />
&nbsp;&nbsp;&nbsp; 关于LazyLoadException异常，使用过Hibernate O/R Mapping工具的人应该都遇到过，网上也是有很多解决的方案，其中Spring提供的一个方案就是在web.xml增加一个filter,示例代码如下:<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">entityManager</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">entityManagerFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">*.action</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp; <br />
</span></div>
<br />
&nbsp; 解决办法有了，接下来应该会有人好奇：这个配置filter后它是如何工作的？<br />
&nbsp; 下面来分析一下这个功能实现的源代码, 不过之前，比较重要的是了解，为何会出现lazyload exception的异常发生。<br />
<br />
&nbsp;&nbsp; 下面我模拟写了一段代码，这段代码就会发生该异常<br />
&nbsp;&nbsp; 注：只是为了说明，相关的代码就省略了。<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">@Entity<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Room&nbsp;{<br />
<br />
&nbsp;@Id<br />
&nbsp;@Column(length</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">32</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;id;<br />
<br />
&nbsp;@Column(length</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;code;<br />
&nbsp;<br />
&nbsp;@OneToMany(mappedBy</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">room</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">default&nbsp;is&nbsp;use&nbsp;lazy&nbsp;load&nbsp;strategy&nbsp;</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;Set&nbsp;desks;<br />
}<br />
<br />
@Entity<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Desk&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Column(length</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">32</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Column(length</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;code;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ManyToOne<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;Room&nbsp;root;<br />
<br />
}<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;RoomSerivce&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Transactional(readOnly</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Room&nbsp;getRoomById(String&nbsp;roomId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notBlank(roomId,&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">room'id&nbsp;is&nbsp;null);</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;getDao().findById(roomId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span><span style="color: rgb(0, 0, 0);"><br />
</span></div>
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;RoomServiceTest&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String[]&nbsp;args[])&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">get&nbsp;service&nbsp;from&nbsp;spring&nbsp;beanfactory</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RoomService&nbsp;service&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;SpringContext.getSerivce(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">roomService</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(service,&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;roomService&nbsp;bean&nbsp;not&nbsp;exsit</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Room&nbsp;room&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;service.getRoomById(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">here&nbsp;lazy&nbsp;exception&nbsp;throw&nbsp;out</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;Desks&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;room.getDesks();<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CollectionsUtils.toString(Desks);<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
&nbsp;&nbsp; 分析这段代码，我们不难发现，在RoomServiceTest这个测试的例子中，因为使用了基于Annotation的声明性事务，所以在RoomSerivce.getRoomById方法运行结束后，事务就已经提交了。但示例中Room实体与Desk实例的关系使用的是lazy fetch的策略，此时Room对象中的desks集合还是为空。<br />
当执行到下面两句时(这才真正使用到desks集合时)<br />
&nbsp; Set Desks = room.getDesks();<br />
&nbsp; CollectionsUtils.toString(Desks);<br />
Hibernate就会根据原来lazy设定的方式，取EntityManager， 根据它从数据库查询 Desk实现的数据，这时上面我们已经提到，事务已经随getRoomById方法的运行结束提交. EntityManager对象也已经关闭。此时再调用 EntityManager操作，就会报EntityManager has been closed 异常(lazy load exception)<br />
<br />
&nbsp;&nbsp; ok, 清楚这块，大家有时可能也猜想到了Spring这个解决方案是怎么处理的了。<br />
&nbsp;&nbsp; Spring的TransactionInterceptor 其就是通过AOP负责拦截着所有针对事务TransactionManager的操作.<br />
&nbsp;&nbsp;
这样Spring就可以针对lazy异常进行拦截了。<br />
<br />
&nbsp;&nbsp;
清楚上面的后，下面的代码是非常好理解了，来看一下OpenEntityManagerInViewFilter的代码:<br />
我加了些注释，大家很容易明白:<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;doFilterInternal(<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response,&nbsp;FilterChain&nbsp;filterChain)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">通过WebApplicationContext,从Web服务中取得context实例后，根据EntityManagerFactory.class类型<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">取得EntityManagerFacotry实例</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManagerFactory&nbsp;emf&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lookupEntityManagerFactory(request);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;participate&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">如果静态方法hasResource已经有EntityManagerFactory实例了，就不用再通过<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">EntityManagerFactory创建一个新EntityManger了</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(TransactionSynchronizationManager.hasResource(emf))&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Do&nbsp;not&nbsp;modify&nbsp;the&nbsp;EntityManager:&nbsp;just&nbsp;set&nbsp;the&nbsp;participate&nbsp;flag.</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;participate&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Opening&nbsp;JPA&nbsp;EntityManager&nbsp;in&nbsp;OpenEntityManagerInViewFilter</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">通过EntityManagerFactory创建一个新EntityManger,并通过bindResource方法<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">保存到TransactionSynchronizationManager中<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">这样，通TransactionSynchronizationManager的getResource方法取得EntityMangerHolder</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManager&nbsp;em&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;createEntityManager(emf);<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.bindResource(emf,&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;EntityManagerHolder(em));<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(PersistenceException&nbsp;ex)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;DataAccessResourceFailureException(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Could&nbsp;not&nbsp;create&nbsp;JPA&nbsp;EntityManager</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;ex);<br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterChain.doFilter(request,&nbsp;response);<br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">finally</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">participate)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">每次请求结束后，就把EntityManager关闭</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManagerHolder&nbsp;emHolder&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(EntityManagerHolder)<br />
</span><span style="color: rgb(0, 128, 128);">38</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.unbindResource(emf);<br />
</span><span style="color: rgb(0, 128, 128);">39</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Closing&nbsp;JPA&nbsp;EntityManager&nbsp;in&nbsp;OpenEntityManagerInViewFilter</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">40</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager());<br />
</span><span style="color: rgb(0, 128, 128);">41</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">42</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">43</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">44</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; <br />
</span></div>
<br />
&nbsp;&nbsp;&nbsp; 上面的代码就不用多解释了， 到现在已经很清楚知道Spring针对 Hibernate的Lazy问题是怎么解决的。<br />
&nbsp;&nbsp;&nbsp; 当然我们可以扩展到除Web服务以外，来实现解决lazy的问题。(我们自己来管理TransactionSynchronizationManager就可以了)<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 当然Spring针对 Hibernate(非JPA的实现)原理也是一样，只是它针对的SessionFactory,也是由TransactionSynchronizationManager来统一管理。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 最后如果大家如还有不清楚的，欢迎一起讨论。<br />
&nbsp;&nbsp;&nbsp; <br />
Good Luck!<br />
Yours Matthew!<br />
<br />
<img src ="http://www.blogjava.net/xmatthew/aggbug/233769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-10-11 18:01 <a href="http://www.blogjava.net/xmatthew/archive/2008/10/11/233769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring3.0新特征-Restful support MVC</title><link>http://www.blogjava.net/xmatthew/archive/2008/09/02/226474.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Tue, 02 Sep 2008 11:32:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/09/02/226474.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/226474.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/09/02/226474.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/226474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/226474.html</trackback:ping><description><![CDATA[&nbsp;最近在Spring官网上发现，Spring 2.5发布不久，Spring3.0项目已经是开始进行了。<br />
<br />
包括很多新功能，如标题中提到的Restful的支持，还有Servlet3.0的支持等。<br />
大概总结了一下，Spring3.0中会包括以下一些新特性:<br />
<ul>
</ul>
<ul>
    <li>1. Full scale REST support by means of additions to the Spring MVC API
    - already pretty detailed, and apparently going to be included in the
    first milestone release</li>
</ul>
<ul>
</ul>
<ul>
    <li>2. Support for Unified EL (as seen in Spring Web Flow) - very likely part of 3.0, but no details given</li>
</ul>
<ul>
    <li>3. Annotation support for declaring factory methods - as above</li>
    <li>4 .Support for Portlet 2.0 (<a href="http://jcp.org/en/jsr/detail?id=286">JSR 286</a>), including resource requests (ResourceServingPortlet) - as above</li>
    <li>5. "Preparations" for Servlet 3.0 specification - sounded a lot like architectural preparations not visible to the "consumer"</li>
    <li>6. Something to fill the gap between Spring Web Flow and Spring MVC - that sounded very vague</li>
    <li>7. Inclusion (probably generalisation) of the repeat, retry and resume semantics provided by <a href="http://static.springframework.org/spring-batch/index.html">Spring Batch</a> - was only hinted at, no details given</li>
    <li>8. Inclusion of the OXM support provided by Spring WS - sounded pretty definitive, but no details given</li>
    <li>9. Some kind of site definition language for the web stack - no idea whether this is more than a rumour</li>
    <li>10. Model-based validation for use both in server and client - as above</li>
</ul>
<br />
下面我们具体介绍一下Restful该特性.<br />
&nbsp; 刚才我也提到了，Spring3.0是基于其目前提供的Spring MVC框架上引入对Rest的支持，这样使其可以很好的融合到Spring中。<br />
&nbsp; 下面有一段代码，大家看了会更有体会。<br />
&nbsp;&nbsp; 先看一下如何发布Rest风格的服务接口<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@RequestMapping(value&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/gadgets/{id}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;RequestMethod.GET)<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;View&nbsp;getGadget(@PathParam&nbsp;String&nbsp;id)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 功能是根据 id 查询 Gadget对象<br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 返回View对象</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">}<br />
</span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);"> <br />
</span></div>
&nbsp;&nbsp; 看到使用Annotation方式，代码非常简洁。@RequestMapping是对访求的资源进行服务的绑定， value指定服务的资源路径, method是指Rest风格中的CRUD的方法。<br />
&nbsp;&nbsp; @PathParam是对资源路么参数的解析,它会自动根据提交的数据格式，解析参数值。<br />
<br />
&nbsp;&nbsp; 下面来看一下<strong>RestTemplate</strong>，对Rest服务接口的调用.<br />
&nbsp;<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 使用</span><span style="color: rgb(0, 128, 0);">getForObject</span><span style="color: rgb(0, 128, 0);">执行查询操作<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp; (指定参数提交方式)</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">RestTemplate&nbsp;template&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;RestTemplate();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">Gadget&nbsp;gadget&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;template.getForObject(<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://www.springify.com/gadgets/{id}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;Gadget.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 使用postForLocation 执行新增操作<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;(</span><span style="color: rgb(0, 128, 0);">指定参数提交方式,使用Map对象</span><span style="color: rgb(0, 128, 0);">)</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">Map</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;params&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;HashMap</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">params.put(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">id</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">42</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">URI&nbsp;uri&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;template.postForLocation(<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://www.springify.com/gadgets/{id}/features</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Feature(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Glows&nbsp;in&nbsp;the&nbsp;dark.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">),&nbsp;params);<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 删除操作的演示</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">template.delete(<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://www.springify.com/gadgets/{id}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;someId);<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">21</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);"> <br />
</span></div>
<br />
总结：可以看到使用Rest风格的服务发布，可以对服务资源进行统一的管理，使用发布的接口更清晰。<br />
<br />
当然在Spring 3.0 发布之前，上述的API，annotation可能会有变动，我们也期待Spring能与我们早日见面。<br />
<br />
最后，由于本人对Rest技术了解还不是太深入，也希望大家能多提些意见和建议。<br />
<br />
Good Luck!<br />
Yours Matthew!<br />
<br />
<img src ="http://www.blogjava.net/xmatthew/aggbug/226474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-09-02 19:32 <a href="http://www.blogjava.net/xmatthew/archive/2008/09/02/226474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate-memcached--在Hibernate中使用Memcached作为一个二级分布式缓存</title><link>http://www.blogjava.net/xmatthew/archive/2008/08/20/223293.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Wed, 20 Aug 2008 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/08/20/223293.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/223293.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/08/20/223293.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/223293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/223293.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天在网上看到一个用Memcached作为Hibernate二级分布式缓存，感觉挺有兴趣，就是尝试用了，感觉还不错，就推荐给大家看一下。&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/08/20/223293.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/223293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-08-20 16:43 <a href="http://www.blogjava.net/xmatthew/archive/2008/08/20/223293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>源代码解读Cas实现单点登出(single sign out)功能实现原理</title><link>http://www.blogjava.net/xmatthew/archive/2008/07/09/213808.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Wed, 09 Jul 2008 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/07/09/213808.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/213808.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/07/09/213808.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/213808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/213808.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 声明：本博客属作者原创，如果任何网站转载本文，请注明作者及引用来源，谢谢合作！关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多，想必大家多多少少都已经有所了解，在此就不再做具体介绍。如果不清楚的，那只能等我把single sign on这块整理出来后再了解了。当然去cas官方网站也是有很多的文章进行介绍。cas官网http://www.ja-sig.org...&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/07/09/213808.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/213808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-07-09 22:44 <a href="http://www.blogjava.net/xmatthew/archive/2008/07/09/213808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Integration 学习笔记(续)</title><link>http://www.blogjava.net/xmatthew/archive/2008/05/28/195731.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Wed, 28 May 2008 13:38:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/05/28/195731.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/195731.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/05/28/195731.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/195731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/195731.html</trackback:ping><description><![CDATA[关于endpoint配置补充<br />
&nbsp;&nbsp;&nbsp; endpoint配置相对比较灵活，下面再来看一个例子：<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">endpoint&nbsp;</span><span style="color: rgb(255, 0, 0);">input-channel</span><span style="color: rgb(0, 0, 255);">="inputChannel"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default-output-channel</span><span style="color: rgb(0, 0, 255);">="outputChannel"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler-ref</span><span style="color: rgb(0, 0, 255);">="helloService"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler-method</span><span style="color: rgb(0, 0, 255);">="sayHello"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">beans:bean&nbsp;</span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="helloService"</span><span style="color: rgb(255, 0, 0);">&nbsp;class</span><span style="color: rgb(0, 0, 255);">="org.springframework.integration.samples.helloworld.HelloService"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp; <br />
</span></div>
<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;HelloService&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;sayHello(String&nbsp;name)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;name;<br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
&nbsp;上面这个例子就演示了把 HelloService配置成一个MessageEndpoint组件，消息从"inputChannel"队列接收后，<br />
&nbsp;调用HelloService.sayHello方法，等sayHello方法返回后，根据default-output-channel="outputChannel"的配置<br />
&nbsp;把返回的结果保存到message.payload属性后发送给"outputChannel"队列<br />
<br />
也可改成Annotation的方式，配置方法如下：<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">annotation-driven</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">message-bus&nbsp;</span><span style="color: rgb(255, 0, 0);">auto-create-channels</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">context:component-scan&nbsp;</span><span style="color: rgb(255, 0, 0);">base-package</span><span style="color: rgb(0, 0, 255);">="org.springframework.integration.samples.helloworld"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">beans:bean&nbsp;</span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="helloService"</span><span style="color: rgb(255, 0, 0);">&nbsp;class</span><span style="color: rgb(0, 0, 255);">="org.springframework.integration.samples.helloworld.HelloService"</span><span style="color: rgb(0, 0, 255);">/&gt;</span></div>
<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@MessageEndpoint(input</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">inputChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;defaultOutput</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">outputChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;HelloService&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;@Handler<br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;sayHello(String&nbsp;name)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;name;<br />
</span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">8</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
设置并发操作属性<br />
xml配置：<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">endpoint&nbsp;</span><span style="color: rgb(255, 0, 0);">input-channel</span><span style="color: rgb(0, 0, 255);">="exampleChannel"</span><span style="color: rgb(255, 0, 0);">&nbsp;handler-ref</span><span style="color: rgb(0, 0, 255);">="exampleHandler"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">&lt;!--</span><span style="color: rgb(0, 128, 0);">&nbsp;设置并发设置&nbsp;core核心线程数&nbsp;max最大线程数&nbsp;queue-capacity&nbsp;队列最大消息数&nbsp;keep-alive&nbsp;idle线程生命时间</span><span style="color: rgb(0, 128, 0);">--&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">concurrency&nbsp;</span><span style="color: rgb(255, 0, 0);">core</span><span style="color: rgb(0, 0, 255);">="5"</span><span style="color: rgb(255, 0, 0);">&nbsp;max</span><span style="color: rgb(0, 0, 255);">="25"</span><span style="color: rgb(255, 0, 0);">&nbsp;queue-capacity</span><span style="color: rgb(0, 0, 255);">="20"</span><span style="color: rgb(255, 0, 0);">&nbsp;keep-alive</span><span style="color: rgb(0, 0, 255);">="120"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">endpoint</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
<br />
annotation配置<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@MessageEndpoint(input</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">fooChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Concurrency(coreSize</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">,&nbsp;maxSize</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">,&nbsp;queueCapacity</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">,&nbsp;keepAliveSeconds</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">120</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;FooService&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;@Handler<br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;bar(Foo&nbsp;foo)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
</span><span style="color: rgb(0, 128, 128);">8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">9</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
下面总结一下常见的annotation的使用方法<br />
<strong><span style="color: rgb(255, 0, 0);"><span style="color: rgb(229, 255, 40);"><span style="color: rgb(48, 61, 255);">@MessageEndpoint</span></span></span></strong><br />
它表示处理消息对象的终端节点。一般与其它的元数据标记一起使用。<br />
下面会具体介绍与该元数据标记一起使用的其它标识的使用方法。<br />
<br />
@MessageEndpoint源代码：<br />
<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Target(ElementType.TYPE)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Retention(RetentionPolicy.RUNTIME)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Inherited<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Documented<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Component<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;@</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;MessageEndpoint&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;input()&nbsp;</span><span style="color: rgb(0, 0, 255);">default</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">接收消息的队列名称</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;defaultOutput()&nbsp;</span><span style="color: rgb(0, 0, 255);">default</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">默认发送消息的队列名称(只有在不设置@Router情况下才有效)</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;pollPeriod()&nbsp;</span><span style="color: rgb(0, 0, 255);">default</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">发送消息的轮循时间间隔(只有在不设置@Router情况下才有效)</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
<strong><span style="color: rgb(48, 61, 255);">@Handler </span></strong><br />
消息回调处理的方法。与@MessageEndpoint一起配置<span style="color: red;">(只限M3版，M4以及后续版本可以单独使用,具体使用方法还要等具体的实现出来)</span>，收到input队列的消息后，回调@Handler标识的方法<br />
回调方法的参数类型必须与message.payload属性类型相同<br />
注：如果回调方法有返回值, 则回调方法处理完成后，会将返回值设置到message.payload属性后，<br />
发送消息到@MessageEndpoint的defaultOutput队列。如果defaultOutput没有设定，则将抛出异常。<br />
<br />
@Handler源代码：<br />
<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Target({ElementType.METHOD,&nbsp;ElementType.ANNOTATION_TYPE})<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Retention(RetentionPolicy.RUNTIME)<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Inherited<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Documented<br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;@</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;Handler&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
下面的例子演示了，从"channel1"队列接收消息后由@Handler标记的方法处理。消息的payload属性值的类型必须与方法的参数类型相同<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@MessageEndpoint(input</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">channel1</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;FooService&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;@Handler<br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;bar(Foo&nbsp;foo)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
</span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">8</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
<br />
<strong><span style="color: rgb(48, 61, 255);">@Polled</span></strong> <br />
必须与@MessageEndPoint 一起使用。但也可以与@Router,@Splitter标识配合使用，后面再分别举例说明。<br />
@Polled 用于开启一个轮循的方式调用方法的功能<br />
它有三个参数：<br />
&nbsp;&nbsp;&nbsp; period: 轮循时间间隔(单位:微秒) 默认为 1000<br />
&nbsp;&nbsp;&nbsp; initialDelay:&nbsp; 轮循延迟时间(单位:微秒) 默认为0<br />
&nbsp;&nbsp;&nbsp; fixedRate: 默认为false<br />
&nbsp;&nbsp;&nbsp; <br />
@Polled 源代码<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Target(ElementType.METHOD)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Retention(RetentionPolicy.RUNTIME)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Inherited<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Documented<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;@</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;Polled&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;period()&nbsp;</span><span style="color: rgb(0, 0, 255);">default</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1000</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;initialDelay()&nbsp;</span><span style="color: rgb(0, 0, 255);">default</span><span style="color: rgb(0, 0, 0);">&nbsp;PollingSchedule.DEFAULT_INITIAL_DELAY;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;fixedRate()&nbsp;</span><span style="color: rgb(0, 0, 255);">default</span><span style="color: rgb(0, 0, 0);">&nbsp;PollingSchedule.DEFAULT_FIXED_RATE;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">}&nbsp; <br />
</span></div>
&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
下面来看几个例子：<br />
例子1:<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@MessageEndpoint(defaultOutput</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">outputChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Counter&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;AtomicInteger&nbsp;count&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;AtomicInteger();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;@Polled(period</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">3000</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;getNumber()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;count.incrementAndGet();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">}&nbsp;&nbsp; <br />
</span></div>
<br />
这个例子功能是，MessageBus启动后，由@Polled标记 每3秒触发getNumber方法，当getNumber方法返回后，<br />
把返回值设置到message.payload属性后，发送到outputChannel队列中。<br />
<br />
<br />
例子2:<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@MessageEndpoint<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Counter&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;AtomicInteger&nbsp;count&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;AtomicInteger();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;@Polled(period</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">3000</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;getNumber()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;count.incrementAndGet();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;@Router<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;resolveChannel(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(i&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">even</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">odd</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">}&nbsp;&nbsp;&nbsp; <br />
</span></div>
<br />
这个例子功能是，MessageBus启动后，由@Polled标记 每3秒触发getNumber方法, 当getNumber方法返回后,<br />
由于resolveChannel方法设置了@Router 标识，则把有getNumber方法返回值都会传给resolveChannel方法，最后<br />
会根据方法的返回值(即队列名称) (@Router标记功能)，把消息发到even队列或是odd队列<br />
<span style="color: rgb(48, 61, 255);"><br />
注：如果@MessageEndpoint类中，在方法上标记了@Router标记后，@MessageEndpoint的defaultOutput就变成无效了。</span><br />
<br />
<strong><span style="color: rgb(48, 61, 255);">@Splitter</span></strong> <br />
必须与@MessageEndPoint 一起使用。<br />
该元数据标识用于分解消息内容，它所在的方法的返回值必须是一个集合(collection).如果集合元素不是Message类型<br />
但发送时，自动把集合中的元素对象保存到Message.payload属性后发送。集合中有多少个元素，则会发送多少次消息。<br />
<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Target(ElementType.METHOD)<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Retention(RetentionPolicy.RUNTIME)<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Documented<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Handler<br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;@</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;Splitter&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;channel();&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">消息发送的队列名</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
<br />
下面两个例子实现效果是一样的<br />
例子1<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@MessageEndpoint(input</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">inputChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;HelloService&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;@Splitter(channel</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">outputChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;sayHello(String&nbsp;name)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;name;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;list&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(s);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;list;<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">}<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;</div>
<br />
例子2<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@MessageEndpoint(input</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">inputChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;HelloService&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;@Splitter(channel</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">outputChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Message</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;sayHello(String&nbsp;name)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;name;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Message</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;list&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Message</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;message&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;GenericMessage</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">(s);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(message);<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;list;<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
<br />
<strong><span style="color: rgb(48, 61, 255);">@Router</span></strong> <br />
消息队列路由功能。 必须与@MessageEndPoint 一起使用。<br />
它所在的方法的返回值类型必须是MessageChannle或是String(channel name)类型<br />
具体的例子参考上面。<br />
<br />
<strong><span style="color: rgb(48, 61, 255);">@Publisher</span></strong> <br />
必须与@MessageEndPoint 一起使用。<br />
说明：@Publisher 标识是根据 after-returning 切面的AOP 在方面返回值时，发送消息到指定消息队列 . &nbsp;&nbsp;&nbsp; <br />
<br />
下面的例子：说明 foo方法调用后，返回值会发送到fooChannel消息队列<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Publisher(channel</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">fooChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;foo()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">bar</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">} <br />
</span></div>
&nbsp;  <br />
<br />
<strong><span style="color: rgb(48, 61, 255);">@Subscriber</span></strong>&nbsp; <br />
必须与@MessageEndPoint 一起使用。<br />
接收指定队列的消息内容。它实现的异步的消息监听事件。<br />
一旦有消息接收到，则会根据message.payload 值作为参数，回调@Subscriber 标识标记的方法<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: rgb(204, 204, 204); background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 0);">@Subscriber(channel</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">fooChannel</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;log(String&nbsp;foo)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(foo);<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
<br />
Good Luck!<br />
Yours Matthew!<br />
2008年4月24日<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/xmatthew/aggbug/195731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-05-28 21:38 <a href="http://www.blogjava.net/xmatthew/archive/2008/05/28/195731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Integration 学习笔记</title><link>http://www.blogjava.net/xmatthew/archive/2008/05/28/193542.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Wed, 28 May 2008 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/05/28/193542.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/193542.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/05/28/193542.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/193542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/193542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: The Cafe Sample(小卖部订餐例子)&nbsp;&nbsp;&nbsp; 小卖部有一个订饮料服务，客户可以通过订单来订购所需要饮料。小卖部提供两种咖啡饮料&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LATTE(拿铁咖啡)和MOCHA(摩卡咖啡)。每种又都分冷饮和热饮&nbsp;&nbsp;&nbsp; 整个流程如下：&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/05/28/193542.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/193542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-05-28 11:49 <a href="http://www.blogjava.net/xmatthew/archive/2008/05/28/193542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAAS学习笔记</title><link>http://www.blogjava.net/xmatthew/archive/2008/05/28/195180.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Wed, 28 May 2008 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/05/28/195180.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/195180.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/05/28/195180.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/195180.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/195180.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 注：例子的原作者是 Paul Feuer和John Musser,我在上面加入些注释以便更好的理解Jaas的实现首先，我们来看一下 JAAS 一个认证操作的实现流程先看一下这个认证操作会使用的接口如下：javax.security.auth.callback.CallbackHandler javax.security.auth.spi.LoginModule下面看...&nbsp;&nbsp;<a href='http://www.blogjava.net/xmatthew/archive/2008/05/28/195180.html'>阅读全文</a><img src ="http://www.blogjava.net/xmatthew/aggbug/195180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-05-28 09:27 <a href="http://www.blogjava.net/xmatthew/archive/2008/05/28/195180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.5 配置文档帮助卡片</title><link>http://www.blogjava.net/xmatthew/archive/2008/05/23/202307.html</link><dc:creator>x.matthew</dc:creator><author>x.matthew</author><pubDate>Fri, 23 May 2008 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/xmatthew/archive/2008/05/23/202307.html</guid><wfw:comment>http://www.blogjava.net/xmatthew/comments/202307.html</wfw:comment><comments>http://www.blogjava.net/xmatthew/archive/2008/05/23/202307.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xmatthew/comments/commentRss/202307.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmatthew/services/trackbacks/202307.html</trackback:ping><description><![CDATA[今天在Spring官方文档看到 Dzone发布了Spring2.5配置文档帮助卡片(Spring 2.5 Configuration Reference Card)。 本人下载看一下，觉得还挺不错，推荐给大家。<br />
该卡片提供比较详细介绍了spring2.5 xml的配置,包括以下四部分<br />
<ul>
    <li> XML elements available as of Spring 2.5(Spring2.5 xml标签配置)</li>
    <li>Most commonly used elements(常用的xml标签使用方法)</li>
    <li>Namespaces（命名空间)</li>
    <li>Guide to Spring&#8217;s rich set of annotations(Spring支持的annotations技术使用指南)<br />
    </li>
</ul>
<br />
&nbsp;<a href="http://refcardz.dzone.com/refcardz/spring-configuration">官方下载地址</a><br />
<br />
下面是官方发布的内容的原文 <a href="http://www.springframework.org/node/660">http://www.springframework.org/node/660</a><br />
<a href="http://www.dzone.com/">DZone</a> has just published a reference card for <a target="_blank" href="http://refcardz.dzone.com/refcardz/spring-configuration">Spring 2.5 Configuration</a>. The card was written by the very knowledgeable <a href="http://www.jroller.com/habuma/">Craig Walls</a> and provides exhaustive details about all the XML configuration options for your <a href="http://static.springframework.org/spring/docs/2.5.x/reference/index.html">Spring 2.5</a>
contexts. It provides a handy desktop reference for any developer
building Spring powered applications. XML averse developers should also
check out the options in Spring 2.5 for <a href="http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config">annotation based configuration</a>.<br />
<br />
<img src ="http://www.blogjava.net/xmatthew/aggbug/202307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmatthew/" target="_blank">x.matthew</a> 2008-05-23 08:51 <a href="http://www.blogjava.net/xmatthew/archive/2008/05/23/202307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>