posts - 155,  comments - 601,  trackbacks - 0
  2008年9月2日
     摘要: jprotobuf-rpc-http 是应用jprotobuf类库实现基于http协议的RPC开发组件。 目前1.0提供可以直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译protobuf IDL语言的麻烦。  阅读全文
posted @ 2014-10-10 15:20 x.matthew 阅读(3366) | 评论 (0)编辑 收藏
     摘要: JProtobuf官方网址:https://github.com/jhunters/jprotobuf
1.0.0 支持普通类型,嵌套对象以及对象数组的Protobuf协议的序列化与反序列化实现。(注解替换proto描述文件)
1.0.1 由注解对象动态生成Protobuf的IDL描述文件内容。
1.0.3 增加由.proto 描述文件动态生成Protobuf操作对象的支持,详见下面使用说明。  阅读全文
posted @ 2014-09-30 11:43 x.matthew 阅读(4558) | 评论 (4)编辑 收藏
     摘要: 如果大家有遇到过Java内存泄露问题,而且亲自动手去定位和分析经历的同学来讲,获取Java的堆内信息对了内存使用情况的问题分析和定位是非常有帮助了。例如我们常用的MAT工具,可以较方便的让我们定位程序中内存的使用情况,是哪块导致了内存的泄露等。
但由于传统的分析过程比较麻烦,需要使用Jdk的jmap(Java Memory Map)命令把heap内存dump到一个文件,然后用MAT进行分析。所以本文介绍一种方法可以实现在线查看heap内存的使用情况,并附上源码实现,希望对大家有帮助。由于目前调研中只找到了Sun JDK6以及以上版本的实现,所以目前该方案只支持Sun JDK6或以上。如果其他同学有其它版本的JDK实现分享,欢迎一起交流。  阅读全文
posted @ 2013-02-20 16:30 x.matthew 阅读(5815) | 评论 (9)编辑 收藏
     摘要: CyclicBarrier一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。假如在涉及一组固定大小的线程的程序应用中,要求这些线程必须不时地互相等待(保证所有线程都执行完毕才返回),那么选择 CyclicBarrier 就会让这个实现变得非常容易。CyclicBarrier 在释放等待线程后可以重用,所以又称它为循环 的 barrier。  阅读全文
posted @ 2012-06-28 13:34 x.matthew 阅读(2578) | 评论 (1)编辑 收藏
     摘要: 本文通过对Apache Commons Collections 项目中LRUMap这个集合类的源代码进行详细解读,为帮助大家更好的了解这个集合类的实现原理以及使用如何该集合类。
首先介绍一下LRU算法. LRU是由Least Recently Used的首字母组成,表示最近最少使用的含义,一般使用在对象淘汰算法上。也是比较常见的一种淘汰算法。  阅读全文
posted @ 2012-06-28 13:34 x.matthew 阅读(5269) | 评论 (1)编辑 收藏
     摘要: Treap=Tree+Heap。Treap本身是一棵二叉搜索树,它的左子树和右子树也分别是一个Treap,和一般的二叉搜索树不同的是,Treap记录一个额外的数据,就是优先级。Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质(在这里我们假设节点的优先级大于该节点的孩子的优先级)。但是这里要注意的是Treap和二叉堆有一点不同,就是二叉堆必须是完全二叉树,而Treap可以并不一定是。  阅读全文
posted @ 2012-05-16 14:37 x.matthew 阅读(3664) | 评论 (0)编辑 收藏
     摘要: 对于Mybatis 拥有的Lazy Load(有中文翻译成延迟加载)功能,应该很同学都有听说过,今天主要与大家一起来解读一下Mybatis在Lazy Load功能的实现的代码。Lazy Load实现的功能很好理解,就是在数据与对象进行Mapping操作时,只有当真正使用该对象时,才进行Mapping操作,以减少不必要的数据库查询开销,从而提升了程序的效率。  阅读全文
posted @ 2011-12-29 19:14 x.matthew 阅读(4868) | 评论 (1)编辑 收藏
     摘要: Thrift出自Facebook用于后台各个服务间的通讯,Thrift的设计强调统一的编程接口的多语言通讯框架.
本文通过一个实例来介绍一下Thrift最基本的应用。  阅读全文
posted @ 2011-11-12 18:57 x.matthew 阅读(15832) | 评论 (4)编辑 收藏
     摘要: JDK Proxy AOP实现与Cglib Proxy AOP实现对比。  阅读全文
posted @ 2011-10-10 19:24 x.matthew 阅读(4890) | 评论 (1)编辑 收藏
     摘要: 在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了foreach功能,该功能比较强大,但由于官方文档对这块的使用,描述的比较简短,细节上也被忽略掉了(可能是开源项目文档一贯的问题吧),也使用不少同学在使用中遇到了问题。特别是foreach这个函数中,collection属性做什么用,有什么注意事项。由于文档不全,这块只能通过源代码剖析的方式来分析一下各个属性的相关要求。  阅读全文
posted @ 2011-08-31 14:38 x.matthew 阅读(50051) | 评论 (4)编辑 收藏
     摘要: 本文主要介绍什么是API,以及API兼容的重要性,最终给出方案如何评估API,以及如何做到API兼容。  阅读全文
posted @ 2011-07-29 19:35 x.matthew 阅读(445) | 评论 (0)编辑 收藏
     摘要: Spring声明式事务功能应该是大家应用Spring中使用的最多的功能之一了,的确该功能极大的简化了大家对数据库操作的。目前Spring支持的声明式事务有两个配置方式,一种是XML配置方式,另一种是注解方式

针对配置这块,XML配置同学们会觉得比较麻烦,特别是针对事务属性的配置,所以补充一下本块配置说明,特分享给大家,希望对大家有帮助。  阅读全文
posted @ 2011-06-23 13:25 x.matthew 阅读(4124) | 评论 (3)编辑 收藏
     摘要: 本月Tomcat 7.0.14版本正式发布,其最显著的一个新功能就是引入了StuckThreadDetectionValve功能,该功能可以帮助分析和检查耗时的请求或潜在可能会出现请求线程阻塞等情况  阅读全文
posted @ 2011-05-25 21:51 x.matthew 阅读(2733) | 评论 (4)编辑 收藏
     摘要: 本文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用。

本篇技术文章将介绍Spring声明式事务管理实现技术细节的剖析。  阅读全文
posted @ 2011-04-29 10:54 x.matthew 阅读(2116) | 评论 (1)编辑 收藏
     摘要: 讲起静态代码分析工具,估计大家耳熟能详的都能讲出几个来,像PMD, Checkstyle, Findbug等。没错这些都是我们日常编码代码时用于提升我们代码质量的好工具,本文将从PMD工具实现的规则出发,通过这些规则的定义来学习一下代码优化的技巧,希望通过这些技巧的介绍可以帮助大家在编码过程中提升大家的代码编写质量。同时也算给大家介绍一个比较不错的途径去学习改进代码编写质量的方法。  阅读全文
posted @ 2011-04-29 10:54 x.matthew 阅读(2298) | 评论 (2)编辑 收藏
     摘要: 本文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用。

本篇技术文章介绍Spring AOP的实现。  阅读全文
posted @ 2011-04-01 10:52 x.matthew 阅读(2249) | 评论 (0)编辑 收藏
     摘要: 本块文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用进行介绍。

本篇技术文章将作为Spring入门篇。
  阅读全文
posted @ 2011-03-14 19:24 x.matthew 阅读(2323) | 评论 (3)编辑 收藏
     摘要: 本文是针对 之前的通过Spring2.5对单元测试的Annotation支持进行TDD开发 进行扩展,增加了Struts Action层的测试实现。虽然Action没有注入到Spring容器,也可以通过 getProxyAction方法,实现Spring容器的属性依赖注入实现  阅读全文
posted @ 2011-02-27 19:15 x.matthew 阅读(1828) | 评论 (2)编辑 收藏
     摘要: 介绍:
Hibernate Envers目的是根据对实体的设置,提供记录执行数据变更历史的功能(数据变更版本)。它实现原理是通过对Hibernate的操作事件监听并根据
基于Annoatation的配置来记录修改数据的内容。  阅读全文
posted @ 2010-08-22 23:20 x.matthew 阅读(8916) | 评论 (1)编辑 收藏
     摘要: 在上篇博客中,介绍了如何借助Spring Module项目,配置声明式缓存功能实现,文中只针对Ehcahce的实现进行了讲解,其它Spring Module项目把这块的功能做了一个很好的抽取,使其能更好的对其它的缓存框架的支持和扩展。笔者正好利用该代码框架实现了与Memcached服务的集成,本文将得点通过源代码解讲一下抽取这层的实现,希望大家有所帮助。  阅读全文
posted @ 2010-05-13 19:53 x.matthew 阅读(4318) | 评论 (2)编辑 收藏
     摘要: 前言:
如果大家使用过Spring事务管理,会发现Spring提供的事务分为“只读”和“读写”事务两类。这不免就会疑问这两种事务会有什么不同?本文则通过对Spring和Hibernate源代码的剖析来找出这两种事务的区别。特别是运行性能方面的区别。
文章调试使用的版本为 Spring 2.5.6.SEC01 ,Hibernate 3.3.2.GA。  阅读全文
posted @ 2010-05-06 19:31 x.matthew 阅读(5819) | 评论 (1)编辑 收藏
     摘要: 本笔记针对Spring-dynamic 1.2.0版本进行一个简单开发应用讲解,使用Apache Felix-1.8.0作为osgi运行环境。  阅读全文
posted @ 2010-04-29 19:08 x.matthew 阅读(4432) | 评论 (2)编辑 收藏
     摘要: 前言:
本文档将讲解一下,如何借助Spring Module项目,实现配置声明性缓存功能。
说明:
本档的配置经过本人测试,都能正确运行。
运行环境: Jdk5.0, Spring-2.5, Spring-modules-0.9, ehcache-1.6.0-beta4.jar  阅读全文
posted @ 2010-04-22 19:47 x.matthew 阅读(3147) | 评论 (4)编辑 收藏
两种Java代码实现方法:

 通过jmx rmi 连接:
          HashMap env = new HashMap(1); 
        
final String[]    credentials    = new String[] { "admin""adminadmin" };
        env.put( JMXConnector.CREDENTIALS, credentials );
        
// so our JMXConnectorProvider may be found
        
//env.put( JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "com.sun.enterprise.admin.jmx.remote.protocol" );
        JMXServiceURL serviceURL = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:8686/management/rmi-jmx-connector");
        JMXConnector connector 
= JMXConnectorFactory.connect(serviceURL , env); 
        MBeanServerConnection connection 
= connector.getMBeanServerConnection(); 
            
        Object o 
= connection.invoke(new ObjectName("com.sun.appserv:type=domain,category=config"), "getName"new Object[]{}, new String[]{});
        System.out.println(o);
 通过jmx http连接
        HashMap env = new HashMap(4);
        env.put( 
"com.sun.enterprise.as.http.auth""BASIC" );
        env.put( 
"USER""admin" );
        env.put( 
"PASSWORD""adminadmin" );
        env.put( JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, 
"com.sun.enterprise.admin.jmx.remote.protocol" );
        JMXServiceURL serviceURL 
= new JMXServiceURL("s1ashttp""localhost"4848);
        
final JMXConnector conn    = JMXConnectorFactory.connect( serviceURL, env );
        MBeanServerConnection connection 
= conn.getMBeanServerConnection(); 
        
        Object o 
= connection.invoke(new ObjectName("com.sun.appserv:type=domain,category=config"), "getName"new Object[]{}, new String[]{});
        System.out.println(o);


Good Luck!
Yours Matthew!

posted @ 2010-03-29 15:42 x.matthew 阅读(2377) | 评论 (0)编辑 收藏
     摘要: 经过这么长时候的等候,终于期待到了Spring3.0 GA版本的发布,猜想众多和我一样期待的朋友应该是会非常高兴等到这一天。

Spring3.0主要新增的特征如下:
1. 完整的Rest API支持(可惜不兼容JSR311规范)
2. Java EE 6 的初步支持
3. 基于声明式的数据模块校验功能
4. 支持内置数据库
5. Spring Expression Language
6. 基于原生的Java API支持,如泛型支持。  阅读全文
posted @ 2009-12-15 22:24 x.matthew 阅读(1574) | 评论 (0)编辑 收藏
     摘要: 本示例中,应用netbeans 6.0版本,演示使用Netbeans IDE自带的Profiler工具,跟踪Java应用程序中发生的内存泄漏问题。本人已经对文档中的操作过程进行尝试,的确能进行内存泄漏的定位,希望能给大家带来帮助。并祝大家国庆,中秋双节快乐!
转自: http://www.javapassion.com/handsonlabs/nbprofilermemory/  阅读全文
posted @ 2009-10-07 11:53 x.matthew 阅读(2580) | 评论 (1)编辑 收藏
     摘要: 本文将介绍使用Eclipse JPDA,在Eclipse的开发环境下对远程运行的Java程序进行调试操作。

请按以下步骤进行(本人已经在Eclipse 3.2, JDK 1.5_08)环境下调试成功。

1. 在启动Java程序时,在Java启动命令中,加入以下参数
Xrunjdwp:transport=dt_socket,address=1234,server=y,suspend=n
注: suspend参数表示,启动时,是否等待JPDA调试端连接。n表示否  阅读全文
posted @ 2009-08-08 11:10 x.matthew 阅读(3917) | 评论 (3)编辑 收藏
     摘要: 在上次发布http://www.blogjava.net/xmatthew/archive/2009/06/30/284825.html游戏之后收到很多人的关注,在此本人表示感谢。这次把整理后的服务器和客户端的程序打包上传,希望大家能喜欢玩这个游戏。  阅读全文
posted @ 2009-07-06 13:12 x.matthew 阅读(3337) | 评论 (10)编辑 收藏
     摘要: 记得刚开始学习中国象棋,还不太明白象棋的规则。所以自然是下得比较糗,所以也不知道是从哪里学来了这种玩法,就是只使用半张的 棋盘空间,把红黑两方的棋子都反面朝下打散,然后玩家就一个个把棋子翻过来,比谁的棋子大,如果相邻的棋子,大的一方可以把小的一方吃掉,到最后谁的棋子先被吃光,则就输了。  阅读全文
posted @ 2009-06-30 19:43 x.matthew 阅读(2045) | 评论 (10)编辑 收藏
     摘要: 针对 JDK IO部分整理的类图
  阅读全文
posted @ 2009-06-13 10:38 x.matthew 阅读(3315) | 评论 (6)编辑 收藏

  由于多年一直在使用MySQL数据库,对其可谓感情深厚。MySQL 从发展初期到现在几经展转,似乎又重回到了最初的开创时期的阶段。不同的是它不在稚嫰,又是更加成熟,发展的更加稳健。祝愿MySQL一路发展顺利。

  开源数据库联盟: http://opendatabasealliance.com/





Good Luck!
Yours Matthew!
posted @ 2009-05-15 09:23 x.matthew 阅读(1401) | 评论 (0)编辑 收藏
     摘要: 终于盼到了五一节,先祝大家节日快乐!
有一阵子没有整理该项目,盼到了五一节,本人也花了些时间,继续改进了该项目的一些功能。此次发布版本为1.2.0。
此次发布包含以下内容:
* Spring-Integration支持。目前支持最新的版本 1.2.0。对Spring-Integration的支持,可以更大的利用Spring-Integration提供的扩展组件。如JMS, FTP, WebService, RMI, HTTP, Stream等。
* 全新的项目的主页,方便大家的交流。
* 重新整理了更详细的 用户文档和平台开发者文档(包括与Spring-Integration集成开发文档)。  阅读全文
posted @ 2009-05-01 22:15 x.matthew 阅读(2521) | 评论 (4)编辑 收藏
     摘要: JNorm是一个Java代码分析工具。
它能够探测代码中的哪些功能可以用现存的开源项目代替,帮助提高代码的可复用性,可维护性。
该项目还提供一个辅助使用的Eclipse插件。  阅读全文
posted @ 2009-04-14 18:39 x.matthew 阅读(1389) | 评论 (4)编辑 收藏
     摘要: 本文以javarebel-2.0 free版本为例,包括如何配置在使用Eclipse插件开发tomcat应用时,实现即时重载java class更改。  阅读全文
posted @ 2009-04-02 11:58 x.matthew 阅读(2532) | 评论 (2)编辑 收藏
     摘要: 在Spring官方网站闲逛,发现Grails 1.1在 2009-03-12正式发布了.

主要新加入的功能特征:
1. Standalone GORM.(可脱离Grails框架单独运行)
2. Maven & Ant+Ivy Support(Grails项目可以通过Maven和Ant Ivy编译)
3. Better Plugins (更好的插件实现,支持通知项目的metadata文件进行安装)
4. Spring Namespace Support
5. JSP Tag Library Support JSP标签库支持  阅读全文
posted @ 2009-03-15 22:48 x.matthew 阅读(1174) | 评论 (1)编辑 收藏
     摘要: 建议学习存储技术可以分为前期准备阶段、存储新人阶段、存储老人阶段、存储高人阶段和存储牛人阶段,每个阶段应该学习或应该达到的目标如下  阅读全文
posted @ 2009-03-10 21:50 x.matthew 阅读(601) | 评论 (2)编辑 收藏
     摘要: 期待这么长时间,终于在SpringSource官方网站发布了M2版本,大部分新特性已经开发完成

* 从Spring3.0开始,就只支持java 5及以上的版本。开始泛型的支持,M2版本中的HibernateTemplate已经实现了泛型的支持。
* 扩展了对并发的支持。M2版本将对java 5的 java.util.concurrent 类库进行更紧密的集成。在将来的Spring 3.0 M3版本会更进一步对配置进行简单,以方便使用。  阅读全文
posted @ 2009-02-27 21:10 x.matthew 阅读(2607) | 评论 (2)编辑 收藏
     摘要: 本人参考官方文档整理出来最完整的Quartz CronTrigger配置说明.  阅读全文
posted @ 2009-02-15 14:41 x.matthew 阅读(71080) | 评论 (12)编辑 收藏
     摘要: 之前向大家推荐过一款Java反编译工具Java Decompiler, 目前该工具有对其进行较大的更新,所以也再次推荐给大家。

官网下载网址:http://java.decompiler.free.fr/
Eclipse 插件更新Url http://java.decompiler.free.fr/jd-eclipse/update  阅读全文
posted @ 2009-02-05 20:34 x.matthew 阅读(6874) | 评论 (3)编辑 收藏
     摘要: iBatis Java Mapper是iBatis+Spring的一个扩展,能够让你使用Java类和接口来代替用于object-SQL映射的XML文档。  阅读全文
posted @ 2009-01-05 21:35 x.matthew 阅读(2699) | 评论 (0)编辑 收藏
     摘要: Spy2server项目发布至今,也有大半年了,很高兴有很多的朋友在使用该项目并给本人也提供很多建议,在此表示感谢。虽然发布至今有这么长时间,但自己真得检讨,一直没有时间对文档进行整理,加上最近项目比较忙所以一直就拖到了现在。在元旦之际终于有时间进行整理,现在共享大家,希望大家多提些建议。当然Spy2servers项目我还会扩展下去,下一部会对Spring-integration集成,达到更好的功能扩展。  阅读全文
posted @ 2009-01-03 17:37 x.matthew 阅读(2009) | 评论 (1)编辑 收藏
     摘要: svenson是一个用于生成和解析JSON数据格式的Java5开源类库。它能够将JSON数据集转换成Java对象或相反的操作。  阅读全文
posted @ 2008-12-29 21:35 x.matthew 阅读(3014) | 评论 (0)编辑 收藏
     摘要: 期待了许久的JSR-315(Servlet 3.0)规范终于Public Review了,这下本人估计就要热闹了。Public Review往往是带来最大的讨论与争议的过程。不过还是希望JSR-315规范能尽早的敲定,让我们这些期盼以久的开发人员能使用这些新特征。  阅读全文
posted @ 2008-12-25 08:44 x.matthew 阅读(1662) | 评论 (0)编辑 收藏
     摘要: 又是一周的周未,不过最近项目一直进展不顺也少了一些悠闲。不过正好,文秘下来给大家发月刊,说是刊中有一题
考大家,前几名回复有奖品。这可一下子让大家一直紧张的情绪,缓和了一些了。

下面是这个题目:

A、B、C三人的年龄一直是一个秘密。将A的年龄数字的位置对调一下,就是B的年龄;C的年龄两倍是A与B
两个年龄的差数;而B的年龄是C的10倍。请问:A、B、C三人的年龄各是多少?  阅读全文
posted @ 2008-12-12 22:58 x.matthew 阅读(3386) | 评论 (23)编辑 收藏
     摘要: Simple是一个XML序列化框架,一个Java版本宽容的序列化框架,能够快速在Java平台上开发XML。支持通过annotations完全配置化的XML结构;提供版本管理框架允许向前和向后兼容序列化;更好的性能,使用轻量级StAX提升XML反序列化进程,比XStream和JAXB更快;通过namespace annotations提供完全的命名空间支持;包括XML模板系统  阅读全文
posted @ 2008-12-10 20:16 x.matthew 阅读(3670) | 评论 (1)编辑 收藏
     摘要: 期待了许久,终于等到Spring Integration 1.0的正式发布。在些先祝贺一了Spring Source公司和Spring integration团队。
下面是本人争取第一时整理的学习笔记(针对最新版本)  阅读全文
posted @ 2008-12-04 08:33 x.matthew 阅读(4476) | 评论 (3)编辑 收藏
     摘要: 前一部分,通过XML的使用方式讲解了The Cafe Sample(小卖部订餐例子)
本笔记接下讲解以Annotation的方式来使用Spring-integration的例子。还是之前的那个示例:
  阅读全文
posted @ 2008-12-04 08:33 x.matthew 阅读(2843) | 评论 (0)编辑 收藏
     摘要: 应该使用过Spring的人都被问题过这个问题, What is Spring?(当然不能回答春天了,呵呵)

其实在Spring官方网站就是具体的介绍,下面本人对其译成了中文.如有翻译不当之处,敬请各位指正。  阅读全文
posted @ 2008-12-01 22:04 x.matthew 阅读(1638) | 评论 (6)编辑 收藏
     摘要: ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能。可以将ftp4j嵌到你的Java应用中,来传输文件(包括上传和下载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。  阅读全文
posted @ 2008-12-01 08:13 x.matthew 阅读(7541) | 评论 (8)编辑 收藏
     摘要: 在网络上看到了这个项目,本人对这个不太了解,但挺兴趣所以也推荐给大家,希望能一起学习。
jNetPcap是libpcap的一个Java完整封装。jNetPcap使用与libpcap相同风格的API。libpcap是unix/linux平台下的网络数据包捕获函数库,大多数网络监控软件都以它为基础。 Libpcap可以在绝大多数类unix平台下工作。Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。  阅读全文
posted @ 2008-11-27 22:55 x.matthew 阅读(10979) | 评论 (1)编辑 收藏
     摘要: 自JDK5.0 引入注解(Annotation)后,让Java的开发简化了很多,让开发者几乎摆脱复杂的
配置文件的烦恼。本文将介绍Spring提供的一套相当于Commons Attribut属性类的注解和一个策略接口 JmxAttributeSource 的实现类 AnnotationsJmxAttributeSource, 这个类允许 MBeanInfoAssembler 来读这些注解。本文就给大家展示一下,使用Spring的JMX annotation,如何简单快速让POJO对象输出到JMX.  阅读全文
posted @ 2008-11-26 22:20 x.matthew 阅读(2473) | 评论 (2)编辑 收藏
     摘要: Cobertura是一个基于jcoverage的免费Java工具,它能够显示哪一部分代码被你的测试所覆盖,并可生成HTML或XML报告. 本文将介绍如何在项目中使用cobertura来测量单元测试的代码覆盖情况.  阅读全文
posted @ 2008-11-25 22:47 x.matthew 阅读(4310) | 评论 (4)编辑 收藏
     摘要: Java Base64 这是一个用于编码和解码(encode/decode )base64字符串和数据流的Java开源类库。Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。可用来作为电子邮件或WebService附件的传输编码.  阅读全文
posted @ 2008-11-25 20:23 x.matthew 阅读(10103) | 评论 (0)编辑 收藏
     摘要: 关键字: Jetty, Cometd, Continuation, dojo

前言:
为了更容易的掌握Jetty cometd的使用方法,本笔记通过讲解Jetty 6.0自带的chat演示程序来辅助讲解Jetty Cometd的实现。  阅读全文
posted @ 2008-11-20 20:04 x.matthew 阅读(13646) | 评论 (10)编辑 收藏
     摘要: 在业余时间开发的一个益智小游戏《老虎过河》。游戏比较简单,前后花了大概一天多的时间,由于对swing接触的太少,所以在界面上花了太多的时间,而且写的比较凌乱。  阅读全文
posted @ 2008-11-16 16:19 x.matthew 阅读(4129) | 评论 (40)编辑 收藏
     摘要: 试用JBoss Envers项目有一阵子了,趁项目发布 1.1.0版,也同时把学习笔记共享给大家,希望对大家有所帮助。
JBoss Envers目的是根据对实体的设置,提供记录执行数据变更历史的功能(数据变更版本)。Envers的配置非常简单,如果需要对某个实例进行历史数据版本记录,只需要在实例上配置@Versioned annotation即可。针对每个实体的版本的历史数据,Envers都会创建一个单独的数据表进行存储。  阅读全文
posted @ 2008-11-14 12:14 x.matthew 阅读(1767) | 评论 (1)编辑 收藏
     摘要: 美国时间2008年11月11日 21点16分, SpringSource宣布并购G2One公司(G2One公司拥有Groovy和Grails两大产品)。此次收购后, SpringSource现在将会向groovy和Grails开发团队提供全面的技术和解决方案的支持。

这对Groovy和Grails开发用户,无疑是一个好消息。  阅读全文
posted @ 2008-11-12 16:34 x.matthew 阅读(1560) | 评论 (5)编辑 收藏
     摘要: memcached安装帮助手册。  阅读全文
posted @ 2008-11-12 12:47 x.matthew 阅读(5379) | 评论 (3)编辑 收藏
     摘要: 目前最新版本为JSDT 1.0.2。
Javascript Debug Toolkit介绍

JSDT(Javascript Debug Toolkit)是一个用于javascript调试的eclipse 插件,用于调试javascript。JSDT可以跨浏览器调试,支持在IE,Firefox,Safari,Chrome等主流浏览器中调试 javascript。JSDT支持设置断点,单步调试等调试工具的基本特性。
当然使用Firefox的朋友也可以选择 FireBug,也是很不错的JS调试工具。  阅读全文
posted @ 2008-11-10 19:54 x.matthew 阅读(30924) | 评论 (8)编辑 收藏
     摘要: 期待了许久,终于等到Spring Integration 1.0的 RC1版本。相对于Spring的其它项目,Spring Integration项目的推进速度的确是比较慢。由于本人对EIP这一块的情有独钟,所以对这一块也是一直追踪着。RC1版本的发布,也代表着1.0 的正式也临近发布了,请我们期待吧。
下面是本人先前整理的学习笔记(目前只针对M6版本,RC1版有一些改动,正在整理中)  阅读全文
posted @ 2008-11-08 12:53 x.matthew 阅读(1538) | 评论 (1)编辑 收藏
NetBeans IDE 6.5 RC2 已经发布了,下面是官方发布的新特性列表:

PHP

  • PHP Editor (Code completion, syntactic and semantic code highlighting)
  • Support for heredoc notation and PHTML
  • Debugging using Xdebug
  • Generators for MySQL database code snippets

JavaScript and Ajax

  • JavaScript Debugging on FireFox & Internet Explorer
  • Http transaction monitoring
  • JavaScript Editor
  • JavaScript Library Manager incl Yahoo UI, Woodstock, jQuery, Dojo, Scriptaculous, Prototype libraries
  • Improved CSS Editor

Java EE & Web Development

  • Enhanced support for Spring, Hibernate, JSF, JSF CRUD generator, JPA (Java Persistence API)
  • Create RESTful web services from database tables or from JPA entities
  • Drag and drop SaaS services into PHP files
  • SQL Editor Improvements (code completion, save/recall queries, and more)
  • Improved Eclipse project import and synchronization for Java Web projects
  • Automatic Deploy on Save

Groovy and Grails

  • Develop pure Groovy apps or use Groovy in Java SE projects
  • Groovy editor (code completion, highlighting, and more)
  • Grails web application framework
  • Open existing Grails applications without adding metadata

Ruby and Rails

  • New Test Runner interface for displaying test results
  • Rake improvements: Rake Runner and a pre-generated Rake file
  • Debugger: Conditional breakpoints and catchpoints
  • Ruby projects accept JVM options from command line

GlassFish v3 Prelude for Web Development

  • Modular, OSGi based architecture
  • Small footprint, fast startup and deployment
  • Support for scripting, including JRuby

C/C++

  • Improved code completion, error highlighting, and semantic highlighting
  • Call graph, Memory window
  • Remote development
  • Packaging of application as tar files, zip files, or SVR4 packages


Java ME

  • New project wizard for adding custom components to the Visual Designer Palette
  • New SVG UI components in the enhanced SVG Composer enable rich UI design
  • New Data Binding Custom Components in the Visual Designer Palette
  • Upgraded obfuscation tool to ProGuard 4.2 and test framework to JMUnit 1.1.0


Java Debugger

  • New multi-threaded debugging with improved UI and work-flow
  • Smart Step Into with method selection right inside expression
  • Deadlock detection with visual indication


Java SE

  • Automatic Compile on Save
  • Improved Eclipse project import and synchronization
  • Java Call Hierarchy
  • Analyze Javadoc
  • Swing GUI Builder can generate simple class names (instead of fully qualified names)


IDE Tools and Usability

  • Camel Case Code Completion
  • Formatting Settings per Project
  • One QuickSearch shortcut for IDE actions, files, options, and docs
  • Support for Windows UNC paths (shared network folders)



posted @ 2008-11-08 12:17 x.matthew 阅读(400) | 评论 (0)编辑 收藏
     摘要: 期待了四个多月的Spring 2.5.6版本终于正式发布了,官网信息.

按照官方3.0版本开发的说明,Spring 2.5.6将会是Spring 2.5分支的最后一个版,整个开发团队将会全力投入到 3.0版本的开发工作。3.0版的MVC将会对Rest进行支持。
Spring 3.0 is in progress now! view roadmap click here  阅读全文
posted @ 2008-11-06 10:25 x.matthew 阅读(2059) | 评论 (0)编辑 收藏
     摘要: 本文从一个例子出发,根据TDD(测试驱动开发)要求,进行开发。只是用于演示如何使用Spring2.5提供的基于Annonation方式的IOC实现,进行TDD开发。

首先我们来看一下这个例子的要求:
开发一个购物车对象,可以添加商品,删除商品,查询已购商口,结账功能。  阅读全文
posted @ 2008-11-05 19:40 x.matthew 阅读(1754) | 评论 (2)编辑 收藏
     摘要: JSON-taglib 是 JSP 2.0 标签库,用于生产 JSON (JavaScript Object Notation) 数据结构。  阅读全文
posted @ 2008-11-03 19:30 x.matthew 阅读(2237) | 评论 (0)编辑 收藏
     摘要: Spring2 针对远程访问服务,提供的一个remote包。其的的是提供一套统一的远程服务发布功能。
Spring2支持远程服务功能如下:
1. RMI服务
2. Hessian或者Burlap通过HTTP远程调用服务
3. HTTP调用器暴露服务
本文结合源码示例,来讲解如何实现这些功能发布。  阅读全文
posted @ 2008-11-02 19:20 x.matthew 阅读(2400) | 评论 (1)编辑 收藏
     摘要: 虽然目前Glassfish V3离正式发布还需要一段时日,但针对V3版这么长久的发布日期,就让人特想认识一下V3版将会给我带来怎么样的新特性。
*组件化架构(OSGi Based Modular architecture)
*可插拔式容器与动态脚本语言支持:
*增强后的命令行模式与管理控制平台:
*基于角色的安全策略支持:
*支持用于内置服务器方式部署:
*提供让人耳目一新的问题剖析框架:
*REST 支持(Jersey):  阅读全文
posted @ 2008-10-30 19:37 x.matthew 阅读(2735) | 评论 (3)编辑 收藏
今天浏览Spring Source官网时,发现其公告栏又增加了一个子项目.Spring workflow.
Spring也加入到了工作流的竞争行例中来了。

下面其官方布的信息:

The Workflow extension brings Spring to the world of workflow programming. Jan Machacek originally started this extension because he was not happy with  the complexity of other workflow management libraries. The Spring Workflow extension treats all components of the workflow as first- 
class Spring beans. As a result, your flows, states and transitions can take advantage of all features in the Spring Framework.

Finally, the unobtrusive approach means that testing your workflows is as easy as testing any other Spring components.

全文的大概意思是: 该项目创始人Jan Machacek,其本人觉得目前已经存在其它的工作流项目过于复杂,难被掌握,所以决定尝试基于Spring,开发一个全新的工作流引擎。Spring Workflow extension作为Spring中一个组件,将会成为目前从多存在的Spring组件中最优秀之一,最终将会使用都在Spring框架上实现流程管理,状态控制和流程迁移控制管理,当然由于基于Spring,所有实现都可以无缝的整合Spring所有特征。

最后补充一句,Spring Workflow最让人关注的一点就是测试Spring Workflow就像使用其它的Spring组件一样的简单,方便。

目前该项目还正处理培育阶段,目前最新的版本为 1.3.0, 点击可直接下载

作者语:

目前开源的工作流项目比较多,但比较做的好的,本人认为JBoss JBPM应该是比较好的一个。无论从其开发工具的支持,开发团队的支持都很不错。但有一点就是有点复杂,不太容易上手。所以期待Spring workflow能否真会给我带来一个惊喜

备注:
Spring workflow 官方网址:
http://springframework.org/extensions/se-workflow
作者Jan Machacek 博客网址 http://unjobs.org/authors/jan-machacek

Good Luck!
Yours Matthew!

 
posted @ 2008-10-30 13:26 x.matthew 阅读(2489) | 评论 (10)编辑 收藏
   推荐一款Java反编译器,也使用了挺久的了,感觉还是很好用,就拿出和大家分享一下。
这款反编译器叫 "Java Decompiler", 由 Pavel Kouznetsov开发,目前最新版本为0.2.5.
它由 C++开发,并且官方可以下载 windows、linux和苹果Mac Os三个平台的可执行程序。 本地windows版本下载

   本人之所以认为它还不错,是其有下面几个功能:
  1. 支持对整个Jar文件进行反编译,并本源代码可直接点击进行相关代码的跳转
  2. 支持众多Java编译器的反编译(支持泛型, Annotation和enum枚举类型)
  • jdk1.1.8
  • jdk1.3.1
  • jdk1.4.2
  • jdk1.5.0
  • jdk1.6.0
  • jikes-1.22
  • harmony-jdk-r533500
  • Eclipse Java Compiler v_677_R32x, 3.2.1 release
  • jrockit90_150_06
   图示:


   3. 快速查找源文件功能(Ctrl+Shift+T)

   4. 安装方便.只有600K,直接运行即可。
   5. 支持文件的拖放功能,源代码高亮显示

  当然对于反编译的效果,感觉还可以。当然在本人使用过程也出现过,编译效果不佳的情况。但从总体上来看已经让我挺满意了,呵呵。

Good Luck!
Yours Matthew!
posted @ 2008-10-28 20:31 x.matthew 阅读(74327) | 评论 (73)编辑 收藏
     摘要: spy2servers已经发布有一段时间了,部分的使用手法都发布在不同的文章中:
http://www.blogjava.net/xmatthew/archive/2008/04/24/194894.html
http://www.blogjava.net/xmatthew/archive/2008/04/21/194349.html
http://www.blogjava.net/xmatthew/archive/2008/03/24/187934.html
http://www.blogjava.net/xmatthew/articles/185673.html
现在应该是时候把它们统一整理出来了。

本手册分为两部分,用户使用手册和开发手册。  阅读全文
posted @ 2008-10-28 12:54 x.matthew 阅读(3759) | 评论 (7)编辑 收藏
     摘要: 本人早期整理的Java工具类学习笔记  阅读全文
posted @ 2008-10-25 20:21 x.matthew 阅读(3922) | 评论 (7)编辑 收藏
    期待了好久了,终于等到了规范的正式的发布。下面官方发布信息,记录了JSR 311规范从筹备到发布的历程。


  Status: Final              
  Stage       Start   Finish  
  Final Release   Download page   10 Oct, 2008      
  Final Approval Ballot   View results   09 Sep, 2008   22 Sep, 2008  
  Proposed Final Draft   Download page   15 Aug, 2008      
  Public Review Ballot   View results   27 May, 2008   02 Jun, 2008  
  Public Review   Download page   02 May, 2008   02 Jun, 2008  
  Early Draft Review   Download page   24 Oct, 2007   23 Nov, 2007  
  Expert Group Formation       27 Feb, 2007   15 Aug, 2007  
  JSR Review Ballot   View results   13 Feb, 2007   26 Feb, 2007  
   
JCP version in use: 2.6
Java Specification Participation Agreement version in use: 2.0
Please direct comments on this JSR to: jsr-311-comments@jcp.org
 


    与其它规范发布一样,伴随此次发布,Sun同步发布该规范的参考实现项目jersey。最新版本为1.0。 为了让大家能快速体验Rest带给我们全新的架构风格,可以直接从本地下载程序。bookstore-1.0.war 源代码 bookmark-1.0-project.zip.

下面展示了一个代码片断,让大家直观感受一下。
 1 @Path("/bank")
 2 public class Bank {
 3 
 4     @POST
 5     @Path("/account/{name}")
 6     public Account createAccount(@PathParam("name") String name, 
 7             @QueryParam("balance")BigDecimal balance) {
 8         //
 9         return new Account(name, balance);
10     }
11     
12     @GET
13     @Path("/account/{name}")
14     public Account getAccount(@PathParam("name") String name) {
15         //
16         return Account.getByName(name);
17     }
18     
19 }
20 


上面的代码,就会发布两个资源服务:

POST /bank/account/newAccount
GET  /bank/account/newAccount

大家看到,用Rest发布资源服务非常方便。当然上面例子只是一个非常简单的示例,用于展示Rest的应用,也希望大家提出好的建议和意见。

Good Luck!
Yours Matthew!


posted @ 2008-10-21 21:29 x.matthew 阅读(5616) | 评论 (3)编辑 收藏
  参读了Hibernate的源代码后,整理了一下Hibernate配置文件中几种实现数据库连接方式的配置方法。(共四个方式)
   1. 程序内部启动 c3p0 连接池。
   配置方式如下:连接池的支持(注:需要c3p0的类库支持)
        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
       
<property name="hibernate.connection.url" value="jdbc:postgresql://xxxxx/xxxx" />
       
<property name="hibernate.connection.username" value="xxxxx" />
       
<property name="hibernate.connection.password" value="xxxx" />
        
<property name="hibernate.c3p0.min_size"
                    value
="5"/>
        
<property name="hibernate.c3p0.max_size"
                    value
="20"/>
        
<property name="hibernate.c3p0.timeout"
                    value
="300"/>
        
<property name="hibernate.c3p0.max_statements"
                    value
="50"/>
        
<property name="hibernate.c3p0.idle_test_period"
                    value
="3000"/>   
   注: Hibernate根据 hibernate.c3p0.max_size 这个配置来识别是支持c3p0连接池

   2. 引用外部连接池    (通过JNDI查找 DataSource资料)
   需要配置方式如下:
      <property name="hibernate.connection.datasource" value="java:comp/env/jdbc/qualitydb"/>

   3. 通过 org.hibernate.connection.ProxoolConnectionProvider 创建
    由
       hibernate.proxool.xml
       hibernate.proxool.properties
       hibernate.proxool.existing_pool 三个配置一起来确定

   4.  DriverManager 创建直接连接方式
       <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
      
<property name="hibernate.connection.url" value="jdbc:postgresql://xxxxx/xxxx" />
      
<property name="hibernate.connection.username" value="xxxxx" />
      
<property name="hibernate.connection.password" value="xxxx" />
    注: Hibernate根据 hibernate.connection.url这个来识别,由于在识别时,c3p0的优先级会高于DriverManger所以,与c3p0的配置不会冲突


Good Luck!
Yours Matthew!
posted @ 2008-10-19 21:19 x.matthew 阅读(3149) | 评论 (0)编辑 收藏

    好久的笔记了,趁刚好休息整理文档,翻出这一部分,稍加整理后,就发上来给大家共享一下,希望对各位有所帮助。

    关于LazyLoadException异常,使用过Hibernate O/R Mapping工具的人应该都遇到过,网上也是有很多解决的方案,其中Spring提供的一个方案就是在web.xml增加一个filter,示例代码如下:

<filter>  
    
<filter-name>entityManager</filter-name>  
    
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>  
</filter>  
  
<filter-mapping>  
    
<filter-name>entityManagerFilter</filter-name>  
    
<url-pattern>*.action</url-pattern>  
</filter-mapping> 

  解决办法有了,接下来应该会有人好奇:这个配置filter后它是如何工作的?
  下面来分析一下这个功能实现的源代码, 不过之前,比较重要的是了解,为何会出现lazyload exception的异常发生。

   下面我模拟写了一段代码,这段代码就会发生该异常
   注:只是为了说明,相关的代码就省略了。

@Entity
public class Room {

 @Id
 @Column(length
=32)
 
private String id;

 @Column(length
=20)
 
private code;
 
 @OneToMany(mappedBy
="room"//default is use lazy load strategy 
 private Set desks;
}

@Entity
public class Desk {

     @Id
     @Column(length
=32)
     
private String id;
    
     @Column(length
=20)
     
private code;
     
     @ManyToOne
     
private Room root;

}

public class RoomSerivce {

    @Transactional(readOnly
=true)
    
public Room getRoomById(String roomId) {
      Assert.notBlank(roomId, 
"room'id is null);
        return getDao().findById(roomId);
    
    }

}


 1 public class RoomServiceTest {
 2 
 3     public static void main(String[] args[]) {
 4     
 5         //get service from spring beanfactory
 6         RoomService service = SpringContext.getSerivce("roomService");
 7         Assert.notNull(service, " roomService bean not exsit");
 8     
 9       Room room = service.getRoomById("1");
10       //here lazy exception throw out
11       Set Desks = room.getDesks();
12       CollectionsUtils.toString(Desks);
13     }
14 }

   分析这段代码,我们不难发现,在RoomServiceTest这个测试的例子中,因为使用了基于Annotation的声明性事务,所以在RoomSerivce.getRoomById方法运行结束后,事务就已经提交了。但示例中Room实体与Desk实例的关系使用的是lazy fetch的策略,此时Room对象中的desks集合还是为空。
当执行到下面两句时(这才真正使用到desks集合时)
  Set Desks = room.getDesks();
  CollectionsUtils.toString(Desks);
Hibernate就会根据原来lazy设定的方式,取EntityManager, 根据它从数据库查询 Desk实现的数据,这时上面我们已经提到,事务已经随getRoomById方法的运行结束提交. EntityManager对象也已经关闭。此时再调用 EntityManager操作,就会报EntityManager has been closed 异常(lazy load exception)

   ok, 清楚这块,大家有时可能也猜想到了Spring这个解决方案是怎么处理的了。
   Spring的TransactionInterceptor 其就是通过AOP负责拦截着所有针对事务TransactionManager的操作.
   这样Spring就可以针对lazy异常进行拦截了。

   清楚上面的后,下面的代码是非常好理解了,来看一下OpenEntityManagerInViewFilter的代码:
我加了些注释,大家很容易明白:

 1     protected void doFilterInternal(
 2             HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
 3             throws ServletException, IOException {
 4 
 5       //通过WebApplicationContext,从Web服务中取得context实例后,根据EntityManagerFactory.class类型
 6       //取得EntityManagerFacotry实例
 7         EntityManagerFactory emf = lookupEntityManagerFactory(request);
 8         boolean participate = false;
 9 
10         //如果静态方法hasResource已经有EntityManagerFactory实例了,就不用再通过
11         //EntityManagerFactory创建一个新EntityManger了
12         if (TransactionSynchronizationManager.hasResource(emf)) {
13             // Do not modify the EntityManager: just set the participate flag.
14             participate = true;
15         }
16         else {
17             logger.debug("Opening JPA EntityManager in OpenEntityManagerInViewFilter");
18             try {
19             //通过EntityManagerFactory创建一个新EntityManger,并通过bindResource方法
20             //保存到TransactionSynchronizationManager中
21             //这样,通TransactionSynchronizationManager的getResource方法取得EntityMangerHolder
22                 EntityManager em = createEntityManager(emf);
23                 TransactionSynchronizationManager.bindResource(emf, new EntityManagerHolder(em));
24             }
25             catch (PersistenceException ex) {
26                 throw new DataAccessResourceFailureException("Could not create JPA EntityManager", ex);
27             }
28         }
29 
30         try {
31             filterChain.doFilter(request, response);
32         }
33 
34         finally {
35             if (!participate) {
36             //每次请求结束后,就把EntityManager关闭
37                 EntityManagerHolder emHolder = (EntityManagerHolder)
38                         TransactionSynchronizationManager.unbindResource(emf);
39                 logger.debug("Closing JPA EntityManager in OpenEntityManagerInViewFilter");
40                 EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager());
41             }
42         }
43     }
44    

    上面的代码就不用多解释了, 到现在已经很清楚知道Spring针对 Hibernate的Lazy问题是怎么解决的。
    当然我们可以扩展到除Web服务以外,来实现解决lazy的问题。(我们自己来管理TransactionSynchronizationManager就可以了)
   
    当然Spring针对 Hibernate(非JPA的实现)原理也是一样,只是它针对的SessionFactory,也是由TransactionSynchronizationManager来统一管理。
   
    最后如果大家如还有不清楚的,欢迎一起讨论。
   
Good Luck!
Yours Matthew!

posted @ 2008-10-11 18:01 x.matthew 阅读(2961) | 评论 (3)编辑 收藏
    盼了好久的国庆节终于到了,整理一下手边的工作,工作进度的追踪,code review和工作管理报告都已经完成。终于松了口气,长假可以尽情休整一下(虽然回来工作会更忙碌),但这段时间可以有很多的自由时间分配,打算给自己好好的冲冲电。

    闲话少说,进入正题。之所以本人要提出"找工作一定要先了解公司的团队文化"这个建议,是因为最近一项工作中的一些事情让我感触颇深,所以写下来,也且当发发牢骚。
    由于最近公司与一个专业的软件公司X公司(不方便直注该公司名称)签订开发了一套比较大的系统,现在到了开发合同到期, 按双方领导协商,开始系统的交接工作。本人被任命参与到这项任务,担任移交过程中所有的技术支持工作。
   
    交接工作其实就是对方公司提交约定要求设计文档,最新的源代码,接口文档,我这边负责审阅这些文档和代码,再重新按公司文档要求重新整理,备案,当然前题我必须完全整理这些文档的内容和代码的每个方法的功能。
    就在移交过程中,发生一些事情,让我头疼了好一阵,才引发了我对大家找工作的这条建议。
    事情的全部经过大概是这样,因为系统比较庞大(其实共有五个独立的子系统组成),所以一个子系统的进行交接,每个子系统交接安排在两周至三周时间。首先交接的就是文档,当我接到文档后,着实让我吃惊不少。文档基本上看不太明白,不仅内容不全,而且基于上与系统对应不上。所谓的设计文档,只有界面设计(而且没有几个与现系统能完全对应上的)与数据表设计外,其它的什么都没有。没有办法,所以让领导干涉,但多次沟通无果后(跨公司合作很难), 最终只要放弃对文档部分的要求,公司这边也是希望我这边通过掌握他们的代码,这样文档部分就可以由我们边来整理了。

   当然读代码并不是件易事,尤其是读别人写的代码。所以我也整理了一套方案,希望对方公司能提供下面一些简单文档以帮助我顺利开展代码的阅读工作。
    1. 程序清单--包括程序名称(功能)对应的源代码文件,对应的数据表名 (因为用C#开发,基本上一个源文件,一个窗体文件)
    2. 接口文档(主要对其它子系统的接口部分,因为他们的实现是通过共享表实现数据交互,所以这块接口说明就更加重要)接口文档希望他们能整理出 接口的功能说明,接口所在的源代码,接口数据表字段说明,触发的动作,触发的频率。

    这次对方公司很合作,三天就把文档写完发给了我们,但质量呢?,除了程序清单还算可以看外,接口文档就丢了几张数据表过来,而且还有三分之一的表名没有列到文档中,其它就什么都没有的。(这是接口说明文档,当然觉得不行了,这个根本没有办法整理), 所以提议想与他们的技术人员沟通一下,猜想可能对方是没有太明白我们接口文档的要求吧,所以沟通后,与他们的一个项目经理协商(到里觉很,安排得很好,这样的任务与技术领导沟通问题应该马上就能解决了,我刻意先打听一下这位经理的一些情况,听说是有很高的学历和资历),准备好说词后,就与这个经理进行了交流,但结果让我有点意外,他强调这个文档没有问题,所以我按原准备好的说词,与他说明接口的重要性,接口文档应该怎么编写。而他的这次回答,就让感觉太意外了。他解释到,接口不是一个东西(头一次听说),在他们的设计中,所有的代码设计都是个人边想边写的,而且他们的系统是一个整体,没有接口(那几个子系统交互的数据说明没有,那还不乱了),所以他解析根本没有"(你们说的)接口"这个东西,是因为我们提了要"(这个他认为不存在的)接口", 所以弄了几张表给你们。还说以前他们给别人做系统,别人从没有这么要过。同时故意询问一下他手下几个做开发的人员,"你们知道接口吗?能按他们要求整理出来吗?"结果他手下很会意的回复到,怎么会有这东西,现在能整理得出数据表已经不错了,我写代码现在早记不清楚,给你们弄表名已经够花时间的了。(真是无话可说),接下来他还要"教导"我,说我对接口是一个错误的理解,要帮我纠正过来。听他们这样的回复,真是无奈的很,但毕竟工作没完成,无法向领导交差,还是坚持的一点希望他们能按要求交出接口文档, 但足足说了20分钟,都无果(可能有人会问,怎么会花这么多时间,我只能说大家都看过大话西游的唐僧吧)。
 
   最后终于放弃(无奈啊),无功而返。回去后,虽然头疼,但必竟是自己的任务没有完后,只好自己花时间读代码,希望把接口这部分的文档整理出来。结果一看代码,简直让我哭笑不得,到处都是不知明的变量a1,ttt,text1,不知明的方法button1Onclick, button5Onclick。方法没有参数,都是通过全局变量来传递,还有更严重的就是数据库操作竟然没有事务(后来与他们一个开发人员交流后,才得知他根据就不知道什么是事务,也不知道事务有什么用途), 与他们经理沟通,结果他很“聪明"来一个拖延战术,没办法,系统问题太多,不交接对方公司就不提供源代码,也就无法解决问题(最终他的战术成功).

   到现在为止交接过程就在这种状况进行近一半了,交接了有二个系统。也陆续见过一些他们的开发人员,都是毕业二三年的年青程序员,实话说看他们的代码,真是件非常痛苦的事情(怎么会有这样的程序员),但反思过来,替他们一想,想必他们刚从大学出来,应该也是雄心壮志,也想做一个优秀的程序员(应该是误入了这个这么糟的团队所致吧)。其实我心里一直想问他们一个问题,"你们真不担心自己的前途和发展吗?"(并非我忋人忧天,像他们虽年轻,但时间一晃就过,照他们现在没有目标规划,只是与现在的团队熬下去的话,到了三十岁以后,那就比较难补救了。)
 
  说了这么多,的确啰嗦了。最后还是强调一下我们观点,找工作,一定要多去了解面试的那个团队的文化氛围。本人认为好的团队,才能带领员工成长和发展的。
祝国庆快乐!

Good Luck!
Yours Matthew!

posted @ 2008-09-29 00:48 x.matthew 阅读(562) | 评论 (1)编辑 收藏
    Tomcat5.5 类装载器的实现都是通过继承于JDK中的 java.lang.ClassLoader类。
    包括Bootstrap,System,Common, Catalina, Shared和Webapp这六种类加载器来实现不同目录的类文件装载。
   
      Bootstrap
          |
       System
          |
       Common
      /      \
 Catalina   Shared
             /   \
        Webapp1  Webapp2 ...


  Bootstrap 类装载器:
      它用于加载最基本的JVM运行环境类,装载JDK目录下类文件($JAVA_HOME/jre/lib/ext)
      使用它的目的是以防一些JVM提供商实现时,可能考虑某些原因会把部分的类文件通过不同的多个类加载加器加载,同时会
      屏蔽一些类加载让应用层的类加载器访问到。
    System 类装载器:
        该类装载器根据JVM的CLASSPATH参数设置装载类文件,该类装载器对于Tomcat内部的程序和应用层的程序都是可见的。
        注:目前tomcat5的启动脚本($CATALINA_HOME/bin/catalina.sh 或 %CATALINA_HOME%\bin\catalina.bat),会把全局环境变量CLASSPATH忽略。
        而且通过下面的几个类库来实现装载设置:
        * $CATALINA_HOME/bin/bootstrap.jar 包含一个main()方法来初始化tomcat5服务,并实例类装器所依赖的类文件。
        * $CATALINA_HOME/bin/tomcat-juli.jar 初始Jakarta commons logging API和 java.util.logging LogManager.
        * $CATALINA_HOME/bin/commons-logging-api-x.y.z.jar - Jakarta commons logging API.
        * $CATALINA_HOME/bin/commons-daemon.jar - Jakarta commons daemon API.
        * jmx.jar - The JMX 1.2 implementation.
    Common 类装载器
        该类装载器对于Tomcat内部的程序和应用层的程序都是可见的.
        当然不太建议把应用层的类库放到这里来加载。
        所有$CATALINA_HOME/lib目录下未压缩的类文件,资源和压缩后Jar/zip文件都会补该类装载器加载。
       
        Tomcat5.5默认该目录的类文件有:
        * commons-el.jar - Jakarta commons el, implementing the expression language used by Jasper.
        * jasper-compiler.jar - The JSP 2.0 compiler.
        * jasper-compiler-jdt.jar - The Eclipse JDT Java compiler.
        * jasper-runtime.jar - The JSP 2.0 runtime.
        * jsp-api.jar - The JSP 2.0 API.
        * naming-common.jar - The JNDI implementation used by Tomcat 5 to represent in-memory naming contexts.
        * naming-factory.jar - The JNDI implementation used by Tomcat 5 to resolve references to enterprise resources (EJB, connection pools).
        * naming-factory-dbcp.jar - Jakarta commons DBCP, providing a JDBC connection pool to web applications. The classes have been moved out of their default org.apache.commons package.
        * naming-java.jar - Handler for the java: namespace.
        * naming-resources.jar - The specialized JNDI naming context implementation used to represent the static resources of a web application. This is not related to the support of the J2EE ENC, and cannot be removed.
        * servlet-api.jar - The Servlet 2.4 API.
        * tomcat-i18n-**.jar - Optional JARs containing resource bundles for other languages. As default bundles are also included in each individual JAR, they can be safely removed if no internationalization of messages is needed.

    Catalina 类装载器:
         该类装载器用都装载tomcat5.5本身所需要的类文件和资源。应用层的类装载器不能访问到它。
          所有$CATALINA_HOME/server/classes目录下未压缩的类文件,资源文件都会补该类装载器加载。
          所有$CATALINA_HOME/server/lib目录下压缩后Jar/zip文件都会补该类装载器加载。
         Tomcat5.5默认该目录的类文件有:
        * catalina.jar - Implementation of the Catalina servlet container portion of Tomcat 5.
        * catalina-ant.jar - Some Ant tasks which can be used to manage Tomcat using the manager web application.
        * catalina-optional.jar - Some optional components of Catalina.
        * commons-modeler.jar - A model MBeans implementation used by Tomcat to expose its internal objects through JMX.
        * servlets-xxxxx.jar - The classes associated with each internal servlet that provides part of Tomcat's functionality. These are separated so that they can be completely removed if the corresponding service is not required, or they can be subject to specialized security manager permissions.
        * tomcat-coyote.jar - Coyote API.
        * tomcat-http.jar - Standalone Java HTTP/1.1 connector.
        * tomcat-ajp.jar - Classes for the Java portion of the AJP web server connector, which allows Tomcat to run behind web servers such as Apache and iPlanet iAS and iWS.
        * tomcat-util.jar - Utility classes required by some Tomcat connectors.     

    Shared 类装载器:
        该类装载器可化被所有的应用程序类装载器共享(除了tomcat本身内部类加载外)
            所有$CATALINA_BASE/shared/classes目录下未压缩的类文件,资源文件都会补该类装载器加载。
          所有$CATALINA_BASE/shared/lib目录下压缩后Jar/zip文件都会补该类装载器加载。
        注: 如果有该类库使用$CATALINA_BASE环境变量启动了多个实例,则该类装载器类库的引使用会$CATALINA_BASE变量而不是$CATALINA_HOME 


    Webapp 类装载器:
        应用层的类装载器,每个应用程序都会创建一个单独的类装载器。该类装载器只能本应用程序中可见。
        所有/WEB-INF/classes目录下未压缩的类文件,资源文件都会补该类装载器加载。
        所有/WEB-INF/lib目录下压缩后Jar/zip文件都会补该类装载器加载。
     
 
    把各个类装载器的定义整理出来后,Tomcat5.5服务器类装载器执行的顺序如下:
    * Bootstrap classes of your JVM
    * System class loader classses (described above)
    * /WEB-INF/classes of your web application
    * /WEB-INF/lib/*.jar of your web application
    * $CATALINA_HOME/common/classes
    * $CATALINA_HOME/common/endorsed/*.jar
    * $CATALINA_HOME/common/i18n/*.jar
    * $CATALINA_HOME/common/lib/*.jar
    * $CATALINA_BASE/shared/classes
    * $CATALINA_BASE/shared/lib/*.jar

Good Luck!
Yours Matthew!

posted @ 2008-09-27 19:28 x.matthew 阅读(2031) | 评论 (1)编辑 收藏
    Tomcat6 类装载器的实现都是通过继承于JDK中的 java.lang.ClassLoader类。
    包括Bootstrap,System,Common和Webapp这四种类加载器来实现不同目录的类文件装载。
    示例结构如下:
      Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ...

  Bootstrap 类装载器:
      它用于加载最基本的JVM运行环境类,装载JDK目录下类文件($JAVA_HOME/jre/lib/ext)
      使用它的目的是以防一些JVM提供商实现时,可能考虑某些原因会把部分的类文件通过不同的多个类加载加器加载,同时会
      屏蔽一些类加载让应用层的类加载器访问到。
    System 类装载器:
        该类装载器根据JVM的CLASSPATH参数设置装载类文件,该类装载器对于Tomcat内部的程序和应用层的程序都是可见的。
        注:目前tomcat5的启动脚本($CATALINA_HOME/bin/catalina.sh 或 %CATALINA_HOME%\bin\catalina.bat),会把全局环境变量CLASSPATH忽略。
            而且通过下面的两个类库来实现装载设置:
            * $CATALINA_HOME/bin/bootstrap.jar 包含一个main()方法来初始化tomcat6服务,并实例类装器所依赖的类文件。
            * $CATALINA_HOME/bin/tomcat-juli.jar 初始Jakarta commons logging API和 java.util.logging LogManager.
    Common 类装载器
        该类装载器对于Tomcat内部的程序和应用层的程序都是可见的.
        当然不太建议把应用层的类库放到这里来加载。
        所有$CATALINA_HOME/lib目录下未压缩的类文件,资源和压缩后Jar/zip文件都会补该类装载器加载。
       
        Tomcat6默认该目录的类文件有:
        * annotations-api.jar - JEE annotations classes.
        * catalina.jar - Implementation of the Catalina servlet container portion of Tomcat6.
        * catalina-ant.jar - Tomcat Catalina Ant tasks.
        * catalina-ha.jar - High availability package.
        * catalina-tribes.jar - Group communication package.
        * el-api.jar - EL 2.1 API.
        * jasper.jar - Jasper 2 Compiler and Runtime.
        * jasper-el.jar - Jasper 2 EL implementation.
        * jasper-jdt.jar - Eclipse JDT 3.2 Java compiler.
        * jsp-api.jar - JSP 2.1 API.
        * servlet-api.jar - Servlet 2.5 API.
        * tomcat-coyote.jar - Tomcat connectors and utility classes.
        * tomcat-dbcp.jar - package renamed database connection pool based on Commons DBCP.
        * tomcat-i18n-**.jar - Optional JARs containing resource bundles for other languages. As default bundles are also included in each individual JAR, they can be safely removed if no internationalization of messages is needed.

    Webapp 类装载器:
      应用层的类装载器,每个应用程序都会创建一个单独的类装载器。该类装载器只能本应用程序中可见。
      所有/WEB-INF/classes目录下未压缩的类文件,资源文件都会补该类装载器加载。
      所有/WEB-INF/lib目录下压缩后Jar/zip文件都会补该类装载器加载。


    把各个类装载器的定义整理出来后,Tomcat6服务器类装载器执行的顺序如下:
   
    * Bootstrap classes of your JVM
    * System class loader classses (described above)
    * /WEB-INF/classes of your web application
    * /WEB-INF/lib/*.jar of your web application
    * $CATALINA_HOME/lib
    * $CATALINA_HOME/lib/*.jar

Good Luck!
Yours Matthew!
posted @ 2008-09-27 19:24 x.matthew 阅读(2729) | 评论 (2)编辑 收藏
 最近在Spring官网上发现,Spring 2.5发布不久,Spring3.0项目已经是开始进行了。

包括很多新功能,如标题中提到的Restful的支持,还有Servlet3.0的支持等。
大概总结了一下,Spring3.0中会包括以下一些新特性:
  • 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
  • 2. Support for Unified EL (as seen in Spring Web Flow) - very likely part of 3.0, but no details given
  • 3. Annotation support for declaring factory methods - as above
  • 4 .Support for Portlet 2.0 (JSR 286), including resource requests (ResourceServingPortlet) - as above
  • 5. "Preparations" for Servlet 3.0 specification - sounded a lot like architectural preparations not visible to the "consumer"
  • 6. Something to fill the gap between Spring Web Flow and Spring MVC - that sounded very vague
  • 7. Inclusion (probably generalisation) of the repeat, retry and resume semantics provided by Spring Batch - was only hinted at, no details given
  • 8. Inclusion of the OXM support provided by Spring WS - sounded pretty definitive, but no details given
  • 9. Some kind of site definition language for the web stack - no idea whether this is more than a rumour
  • 10. Model-based validation for use both in server and client - as above

下面我们具体介绍一下Restful该特性.
  刚才我也提到了,Spring3.0是基于其目前提供的Spring MVC框架上引入对Rest的支持,这样使其可以很好的融合到Spring中。
  下面有一段代码,大家看了会更有体会。
   先看一下如何发布Rest风格的服务接口
1 @RequestMapping(value = "/gadgets/{id}",
2       method = RequestMethod.GET)
3 public View getGadget(@PathParam String id) {
4   // 功能是根据 id 查询 Gadget对象
5   // 返回View对象
6 }
7 
   看到使用Annotation方式,代码非常简洁。@RequestMapping是对访求的资源进行服务的绑定, value指定服务的资源路径, method是指Rest风格中的CRUD的方法。
   @PathParam是对资源路么参数的解析,它会自动根据提交的数据格式,解析参数值。

   下面来看一下RestTemplate,对Rest服务接口的调用.
 
 1 // 使用getForObject执行查询操作
 2 //  (指定参数提交方式)
 3 RestTemplate template = new RestTemplate();
 4 Gadget gadget = template.getForObject(
 5     "http://www.springify.com/gadgets/{id}",
 6     Gadget.class1);
 7 
 8 // 使用postForLocation 执行新增操作
 9 // (指定参数提交方式,使用Map对象)
10 Map<String, String> params =
11     new HashMap<String, String>();
12 params.put("id"42);
13 URI uri = template.postForLocation(
14     "http://www.springify.com/gadgets/{id}/features",
15     new Feature("Glows in the dark."), params);
16 
17 // 删除操作的演示
18 template.delete(
19     "http://www.springify.com/gadgets/{id}", someId);
20 
21
29 

总结:可以看到使用Rest风格的服务发布,可以对服务资源进行统一的管理,使用发布的接口更清晰。

当然在Spring 3.0 发布之前,上述的API,annotation可能会有变动,我们也期待Spring能与我们早日见面。

最后,由于本人对Rest技术了解还不是太深入,也希望大家能多提些意见和建议。

Good Luck!
Yours Matthew!

posted @ 2008-09-02 19:32 x.matthew 阅读(4639) | 评论 (4)编辑 收藏