![](http://www.blogjava.net/images/link.gif)
2008年4月23日
摘要: 1. Springboot config示例与原理介绍1.1 Springboot config示例Springboot给我们提供了非常便捷与方便的配置使用方式,常用的使用示例有以下两种:1)使用@ConfigurationProperties 读取多个属性使用方法:@ConfigurationProperties(prefix = "spring.datasource")使用说明:提供...
阅读全文
posted @
2021-04-08 20:00 x.matthew 阅读(488) |
评论 (0) |
编辑 收藏
摘要: jprotobuf-rpc-http 是应用jprotobuf类库实现基于http协议的RPC开发组件。 目前1.0提供可以直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译protobuf IDL语言的麻烦。
阅读全文
posted @
2014-10-10 15:20 x.matthew 阅读(3502) |
评论 (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 阅读(4846) |
评论 (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 阅读(6267) |
评论 (9) |
编辑 收藏
摘要: CyclicBarrier一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。假如在涉及一组固定大小的线程的程序应用中,要求这些线程必须不时地互相等待(保证所有线程都执行完毕才返回),那么选择 CyclicBarrier 就会让这个实现变得非常容易。CyclicBarrier 在释放等待线程后可以重用,所以又称它为循环 的 barrier。
阅读全文
posted @
2012-06-28 13:34 x.matthew 阅读(2724) |
评论 (1) |
编辑 收藏
摘要: 本文通过对Apache Commons Collections 项目中LRUMap这个集合类的源代码进行详细解读,为帮助大家更好的了解这个集合类的实现原理以及使用如何该集合类。
首先介绍一下LRU算法. LRU是由Least Recently Used的首字母组成,表示最近最少使用的含义,一般使用在对象淘汰算法上。也是比较常见的一种淘汰算法。
阅读全文
posted @
2012-06-28 13:34 x.matthew 阅读(5773) |
评论 (1) |
编辑 收藏
摘要: Treap=Tree+Heap。Treap本身是一棵二叉搜索树,它的左子树和右子树也分别是一个Treap,和一般的二叉搜索树不同的是,Treap记录一个额外的数据,就是优先级。Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质(在这里我们假设节点的优先级大于该节点的孩子的优先级)。但是这里要注意的是Treap和二叉堆有一点不同,就是二叉堆必须是完全二叉树,而Treap可以并不一定是。
阅读全文
posted @
2012-05-16 14:37 x.matthew 阅读(4231) |
评论 (0) |
编辑 收藏
摘要: 对于Mybatis 拥有的Lazy Load(有中文翻译成延迟加载)功能,应该很同学都有听说过,今天主要与大家一起来解读一下Mybatis在Lazy Load功能的实现的代码。Lazy Load实现的功能很好理解,就是在数据与对象进行Mapping操作时,只有当真正使用该对象时,才进行Mapping操作,以减少不必要的数据库查询开销,从而提升了程序的效率。
阅读全文
posted @
2011-12-29 19:14 x.matthew 阅读(4992) |
评论 (1) |
编辑 收藏
摘要: Thrift出自Facebook用于后台各个服务间的通讯,Thrift的设计强调统一的编程接口的多语言通讯框架.
本文通过一个实例来介绍一下Thrift最基本的应用。
阅读全文
posted @
2011-11-12 18:57 x.matthew 阅读(17865) |
评论 (4) |
编辑 收藏
摘要: JDK Proxy AOP实现与Cglib Proxy AOP实现对比。
阅读全文
posted @
2011-10-10 19:24 x.matthew 阅读(5004) |
评论 (1) |
编辑 收藏
摘要: 在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了foreach功能,该功能比较强大,但由于官方文档对这块的使用,描述的比较简短,细节上也被忽略掉了(可能是开源项目文档一贯的问题吧),也使用不少同学在使用中遇到了问题。特别是foreach这个函数中,collection属性做什么用,有什么注意事项。由于文档不全,这块只能通过源代码剖析的方式来分析一下各个属性的相关要求。
阅读全文
posted @
2011-08-31 14:38 x.matthew 阅读(50526) |
评论 (4) |
编辑 收藏
摘要: 本文主要介绍什么是API,以及API兼容的重要性,最终给出方案如何评估API,以及如何做到API兼容。
阅读全文
posted @
2011-07-29 19:35 x.matthew 阅读(561) |
评论 (0) |
编辑 收藏
摘要: Spring声明式事务功能应该是大家应用Spring中使用的最多的功能之一了,的确该功能极大的简化了大家对数据库操作的。目前Spring支持的声明式事务有两个配置方式,一种是XML配置方式,另一种是注解方式
针对配置这块,XML配置同学们会觉得比较麻烦,特别是针对事务属性的配置,所以补充一下本块配置说明,特分享给大家,希望对大家有帮助。
阅读全文
posted @
2011-06-23 13:25 x.matthew 阅读(4362) |
评论 (3) |
编辑 收藏
摘要: 本月Tomcat 7.0.14版本正式发布,其最显著的一个新功能就是引入了StuckThreadDetectionValve功能,该功能可以帮助分析和检查耗时的请求或潜在可能会出现请求线程阻塞等情况
阅读全文
posted @
2011-05-25 21:51 x.matthew 阅读(3030) |
评论 (4) |
编辑 收藏
摘要: 本文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用。
本篇技术文章将介绍Spring声明式事务管理实现技术细节的剖析。
阅读全文
posted @
2011-04-29 10:54 x.matthew 阅读(2173) |
评论 (1) |
编辑 收藏
摘要: 讲起静态代码分析工具,估计大家耳熟能详的都能讲出几个来,像PMD, Checkstyle, Findbug等。没错这些都是我们日常编码代码时用于提升我们代码质量的好工具,本文将从PMD工具实现的规则出发,通过这些规则的定义来学习一下代码优化的技巧,希望通过这些技巧的介绍可以帮助大家在编码过程中提升大家的代码编写质量。同时也算给大家介绍一个比较不错的途径去学习改进代码编写质量的方法。
阅读全文
posted @
2011-04-29 10:54 x.matthew 阅读(2345) |
评论 (2) |
编辑 收藏
摘要: 本文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用。
本篇技术文章介绍Spring AOP的实现。
阅读全文
posted @
2011-04-01 10:52 x.matthew 阅读(2334) |
评论 (0) |
编辑 收藏
摘要: 本块文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用进行介绍。
本篇技术文章将作为Spring入门篇。
阅读全文
posted @
2011-03-14 19:24 x.matthew 阅读(2431) |
评论 (3) |
编辑 收藏
摘要: 本文是针对 之前的通过Spring2.5对单元测试的Annotation支持进行TDD开发 进行扩展,增加了Struts Action层的测试实现。虽然Action没有注入到Spring容器,也可以通过 getProxyAction方法,实现Spring容器的属性依赖注入实现
阅读全文
posted @
2011-02-27 19:15 x.matthew 阅读(1922) |
评论 (2) |
编辑 收藏
摘要: 介绍:
Hibernate Envers目的是根据对实体的设置,提供记录执行数据变更历史的功能(数据变更版本)。它实现原理是通过对Hibernate的操作事件监听并根据
基于Annoatation的配置来记录修改数据的内容。
阅读全文
posted @
2010-08-22 23:20 x.matthew 阅读(9360) |
评论 (1) |
编辑 收藏
摘要: 在上篇博客中,介绍了如何借助Spring Module项目,配置声明式缓存功能实现,文中只针对Ehcahce的实现进行了讲解,其它Spring Module项目把这块的功能做了一个很好的抽取,使其能更好的对其它的缓存框架的支持和扩展。笔者正好利用该代码框架实现了与Memcached服务的集成,本文将得点通过源代码解讲一下抽取这层的实现,希望大家有所帮助。
阅读全文
posted @
2010-05-13 19:53 x.matthew 阅读(4422) |
评论 (2) |
编辑 收藏
摘要: 前言:
如果大家使用过Spring事务管理,会发现Spring提供的事务分为“只读”和“读写”事务两类。这不免就会疑问这两种事务会有什么不同?本文则通过对Spring和Hibernate源代码的剖析来找出这两种事务的区别。特别是运行性能方面的区别。
文章调试使用的版本为 Spring 2.5.6.SEC01 ,Hibernate 3.3.2.GA。
阅读全文
posted @
2010-05-06 19:31 x.matthew 阅读(6014) |
评论 (1) |
编辑 收藏
摘要: 本笔记针对Spring-dynamic 1.2.0版本进行一个简单开发应用讲解,使用Apache Felix-1.8.0作为osgi运行环境。
阅读全文
posted @
2010-04-29 19:08 x.matthew 阅读(4526) |
评论 (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 阅读(3278) |
评论 (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 阅读(2521) |
评论 (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 阅读(1617) |
评论 (0) |
编辑 收藏
摘要: 本示例中,应用netbeans 6.0版本,演示使用Netbeans IDE自带的Profiler工具,跟踪Java应用程序中发生的内存泄漏问题。本人已经对文档中的操作过程进行尝试,的确能进行内存泄漏的定位,希望能给大家带来帮助。并祝大家国庆,中秋双节快乐!
转自: http://www.javapassion.com/handsonlabs/nbprofilermemory/
阅读全文
posted @
2009-10-07 11:53 x.matthew 阅读(2817) |
评论 (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 阅读(4071) |
评论 (3) |
编辑 收藏
摘要: 在上次发布http://www.blogjava.net/xmatthew/archive/2009/06/30/284825.html游戏之后收到很多人的关注,在此本人表示感谢。这次把整理后的服务器和客户端的程序打包上传,希望大家能喜欢玩这个游戏。
阅读全文
posted @
2009-07-06 13:12 x.matthew 阅读(3618) |
评论 (10) |
编辑 收藏
摘要: 记得刚开始学习中国象棋,还不太明白象棋的规则。所以自然是下得比较糗,所以也不知道是从哪里学来了这种玩法,就是只使用半张的 棋盘空间,把红黑两方的棋子都反面朝下打散,然后玩家就一个个把棋子翻过来,比谁的棋子大,如果相邻的棋子,大的一方可以把小的一方吃掉,到最后谁的棋子先被吃光,则就输了。
阅读全文
posted @
2009-06-30 19:43 x.matthew 阅读(2251) |
评论 (10) |
编辑 收藏
摘要: 针对 JDK IO部分整理的类图
阅读全文
posted @
2009-06-13 10:38 x.matthew 阅读(3413) |
评论 (6) |
编辑 收藏
由于多年一直在使用MySQL数据库,对其可谓感情深厚。MySQL 从发展初期到现在几经展转,似乎又重回到了最初的开创时期的阶段。不同的是它不在稚嫰,又是更加成熟,发展的更加稳健。祝愿MySQL一路发展顺利。
开源数据库联盟:
http://opendatabasealliance.com/
Good Luck!
Yours Matthew!
posted @
2009-05-15 09:23 x.matthew 阅读(1507) |
评论 (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 阅读(2636) |
评论 (4) |
编辑 收藏
摘要: JNorm是一个Java代码分析工具。
它能够探测代码中的哪些功能可以用现存的开源项目代替,帮助提高代码的可复用性,可维护性。
该项目还提供一个辅助使用的Eclipse插件。
阅读全文
posted @
2009-04-14 18:39 x.matthew 阅读(1493) |
评论 (4) |
编辑 收藏
摘要: 本文以javarebel-2.0 free版本为例,包括如何配置在使用Eclipse插件开发tomcat应用时,实现即时重载java class更改。
阅读全文
posted @
2009-04-02 11:58 x.matthew 阅读(2621) |
评论 (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 阅读(1241) |
评论 (1) |
编辑 收藏
摘要: 建议学习存储技术可以分为前期准备阶段、存储新人阶段、存储老人阶段、存储高人阶段和存储牛人阶段,每个阶段应该学习或应该达到的目标如下
阅读全文
posted @
2009-03-10 21:50 x.matthew 阅读(681) |
评论 (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 阅读(2676) |
评论 (2) |
编辑 收藏
摘要: 本人参考官方文档整理出来最完整的Quartz CronTrigger配置说明.
阅读全文
posted @
2009-02-15 14:41 x.matthew 阅读(72213) |
评论 (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 阅读(6999) |
评论 (3) |
编辑 收藏
摘要: iBatis Java Mapper是iBatis+Spring的一个扩展,能够让你使用Java类和接口来代替用于object-SQL映射的XML文档。
阅读全文
posted @
2009-01-05 21:35 x.matthew 阅读(2792) |
评论 (0) |
编辑 收藏
摘要: Spy2server项目发布至今,也有大半年了,很高兴有很多的朋友在使用该项目并给本人也提供很多建议,在此表示感谢。虽然发布至今有这么长时间,但自己真得检讨,一直没有时间对文档进行整理,加上最近项目比较忙所以一直就拖到了现在。在元旦之际终于有时间进行整理,现在共享大家,希望大家多提些建议。当然Spy2servers项目我还会扩展下去,下一部会对Spring-integration集成,达到更好的功能扩展。
阅读全文
posted @
2009-01-03 17:37 x.matthew 阅读(2086) |
评论 (1) |
编辑 收藏
摘要: svenson是一个用于生成和解析JSON数据格式的Java5开源类库。它能够将JSON数据集转换成Java对象或相反的操作。
阅读全文
posted @
2008-12-29 21:35 x.matthew 阅读(3105) |
评论 (0) |
编辑 收藏
摘要: 期待了许久的JSR-315(Servlet 3.0)规范终于Public Review了,这下本人估计就要热闹了。Public Review往往是带来最大的讨论与争议的过程。不过还是希望JSR-315规范能尽早的敲定,让我们这些期盼以久的开发人员能使用这些新特征。
阅读全文
posted @
2008-12-25 08:44 x.matthew 阅读(1836) |
评论 (0) |
编辑 收藏
摘要: 又是一周的周未,不过最近项目一直进展不顺也少了一些悠闲。不过正好,文秘下来给大家发月刊,说是刊中有一题
考大家,前几名回复有奖品。这可一下子让大家一直紧张的情绪,缓和了一些了。
下面是这个题目:
A、B、C三人的年龄一直是一个秘密。将A的年龄数字的位置对调一下,就是B的年龄;C的年龄两倍是A与B
两个年龄的差数;而B的年龄是C的10倍。请问:A、B、C三人的年龄各是多少?
阅读全文
posted @
2008-12-12 22:58 x.matthew 阅读(3527) |
评论 (23) |
编辑 收藏
摘要: Simple是一个XML序列化框架,一个Java版本宽容的序列化框架,能够快速在Java平台上开发XML。支持通过annotations完全配置化的XML结构;提供版本管理框架允许向前和向后兼容序列化;更好的性能,使用轻量级StAX提升XML反序列化进程,比XStream和JAXB更快;通过namespace annotations提供完全的命名空间支持;包括XML模板系统
阅读全文
posted @
2008-12-10 20:16 x.matthew 阅读(3819) |
评论 (1) |
编辑 收藏
摘要: 期待了许久,终于等到Spring Integration 1.0的正式发布。在些先祝贺一了Spring Source公司和Spring integration团队。
下面是本人争取第一时整理的学习笔记(针对最新版本)
阅读全文
posted @
2008-12-04 08:33 x.matthew 阅读(4751) |
评论 (3) |
编辑 收藏
摘要: 前一部分,通过XML的使用方式讲解了The Cafe Sample(小卖部订餐例子)
本笔记接下讲解以Annotation的方式来使用Spring-integration的例子。还是之前的那个示例:
阅读全文
posted @
2008-12-04 08:33 x.matthew 阅读(3232) |
评论 (0) |
编辑 收藏
摘要: 应该使用过Spring的人都被问题过这个问题, What is Spring?(当然不能回答春天了,呵呵)
其实在Spring官方网站就是具体的介绍,下面本人对其译成了中文.如有翻译不当之处,敬请各位指正。
阅读全文
posted @
2008-12-01 22:04 x.matthew 阅读(1731) |
评论 (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 阅读(7715) |
评论 (8) |
编辑 收藏
摘要: 在网络上看到了这个项目,本人对这个不太了解,但挺兴趣所以也推荐给大家,希望能一起学习。
jNetPcap是libpcap的一个Java完整封装。jNetPcap使用与libpcap相同风格的API。libpcap是unix/linux平台下的网络数据包捕获函数库,大多数网络监控软件都以它为基础。 Libpcap可以在绝大多数类unix平台下工作。Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。
阅读全文
posted @
2008-11-27 22:55 x.matthew 阅读(11739) |
评论 (1) |
编辑 收藏
摘要: 自JDK5.0 引入注解(Annotation)后,让Java的开发简化了很多,让开发者几乎摆脱复杂的
配置文件的烦恼。本文将介绍Spring提供的一套相当于Commons Attribut属性类的注解和一个策略接口 JmxAttributeSource 的实现类 AnnotationsJmxAttributeSource, 这个类允许 MBeanInfoAssembler 来读这些注解。本文就给大家展示一下,使用Spring的JMX annotation,如何简单快速让POJO对象输出到JMX.
阅读全文
posted @
2008-11-26 22:20 x.matthew 阅读(2570) |
评论 (2) |
编辑 收藏
摘要: Cobertura是一个基于jcoverage的免费Java工具,它能够显示哪一部分代码被你的测试所覆盖,并可生成HTML或XML报告. 本文将介绍如何在项目中使用cobertura来测量单元测试的代码覆盖情况.
阅读全文
posted @
2008-11-25 22:47 x.matthew 阅读(4519) |
评论 (4) |
编辑 收藏
摘要: Java Base64 这是一个用于编码和解码(encode/decode )base64字符串和数据流的Java开源类库。Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。可用来作为电子邮件或WebService附件的传输编码.
阅读全文
posted @
2008-11-25 20:23 x.matthew 阅读(10264) |
评论 (0) |
编辑 收藏
摘要: 关键字: Jetty, Cometd, Continuation, dojo
前言:
为了更容易的掌握Jetty cometd的使用方法,本笔记通过讲解Jetty 6.0自带的chat演示程序来辅助讲解Jetty Cometd的实现。
阅读全文
posted @
2008-11-20 20:04 x.matthew 阅读(13904) |
评论 (10) |
编辑 收藏
摘要: 在业余时间开发的一个益智小游戏《老虎过河》。游戏比较简单,前后花了大概一天多的时间,由于对swing接触的太少,所以在界面上花了太多的时间,而且写的比较凌乱。
阅读全文
posted @
2008-11-16 16:19 x.matthew 阅读(4679) |
评论 (40) |
编辑 收藏
摘要: 试用JBoss Envers项目有一阵子了,趁项目发布 1.1.0版,也同时把学习笔记共享给大家,希望对大家有所帮助。
JBoss Envers目的是根据对实体的设置,提供记录执行数据变更历史的功能(数据变更版本)。Envers的配置非常简单,如果需要对某个实例进行历史数据版本记录,只需要在实例上配置@Versioned annotation即可。针对每个实体的版本的历史数据,Envers都会创建一个单独的数据表进行存储。
阅读全文
posted @
2008-11-14 12:14 x.matthew 阅读(1848) |
评论 (1) |
编辑 收藏
摘要: 美国时间2008年11月11日 21点16分, SpringSource宣布并购G2One公司(G2One公司拥有Groovy和Grails两大产品)。此次收购后, SpringSource现在将会向groovy和Grails开发团队提供全面的技术和解决方案的支持。
这对Groovy和Grails开发用户,无疑是一个好消息。
阅读全文
posted @
2008-11-12 16:34 x.matthew 阅读(1669) |
评论 (5) |
编辑 收藏
摘要: memcached安装帮助手册。
阅读全文
posted @
2008-11-12 12:47 x.matthew 阅读(5465) |
评论 (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 阅读(31330) |
评论 (8) |
编辑 收藏
摘要: 期待了许久,终于等到Spring Integration 1.0的 RC1版本。相对于Spring的其它项目,Spring Integration项目的推进速度的确是比较慢。由于本人对EIP这一块的情有独钟,所以对这一块也是一直追踪着。RC1版本的发布,也代表着1.0 的正式也临近发布了,请我们期待吧。
下面是本人先前整理的学习笔记(目前只针对M6版本,RC1版有一些改动,正在整理中)
阅读全文
posted @
2008-11-08 12:53 x.matthew 阅读(1641) |
评论 (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
|
![](/images/blogjava_net/xmatthew/netbeans65/php-code.png)
|
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
|
![](/images/blogjava_net/xmatthew/netbeans65/javascript-quickfix.png)
|
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
|
![](/images/blogjava_net/xmatthew/netbeans65/spring-web-app-refactor.png)
|
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
|
![](/images/blogjava_net/xmatthew/netbeans65/groovy-editor.jpg)
|
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
|
![](/images/blogjava_net/xmatthew/netbeans65/ruby.png)
|
GlassFish v3 Prelude for Web Development
- Modular, OSGi based architecture
- Small footprint, fast startup and deployment
- Support for scripting, including JRuby
|
![](/images/blogjava_net/xmatthew/netbeans65/glassfish.jpg)
|
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
|
![](/images/blogjava_net/xmatthew/netbeans65/call-graph.png)
|
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
|
![](/images/blogjava_net/xmatthew/netbeans65/mobility.png)
|
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
|
![](/images/blogjava_net/xmatthew/netbeans65/debugger.png)
|
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)
|
![](/images/blogjava_net/xmatthew/netbeans65/gui-builder-class-names.png)
|
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)
|
![](/images/blogjava_net/xmatthew/netbeans65/quick-search.gif)
|
posted @
2008-11-08 12:17 x.matthew 阅读(461) |
评论 (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 阅读(2183) |
评论 (0) |
编辑 收藏
摘要: 本文从一个例子出发,根据TDD(测试驱动开发)要求,进行开发。只是用于演示如何使用Spring2.5提供的基于Annonation方式的IOC实现,进行TDD开发。
首先我们来看一下这个例子的要求:
开发一个购物车对象,可以添加商品,删除商品,查询已购商口,结账功能。
阅读全文
posted @
2008-11-05 19:40 x.matthew 阅读(1883) |
评论 (2) |
编辑 收藏
摘要: JSON-taglib 是 JSP 2.0 标签库,用于生产 JSON (JavaScript Object Notation) 数据结构。
阅读全文
posted @
2008-11-03 19:30 x.matthew 阅读(2325) |
评论 (0) |
编辑 收藏
摘要: Spring2 针对远程访问服务,提供的一个remote包。其的的是提供一套统一的远程服务发布功能。
Spring2支持远程服务功能如下:
1. RMI服务
2. Hessian或者Burlap通过HTTP远程调用服务
3. HTTP调用器暴露服务
本文结合源码示例,来讲解如何实现这些功能发布。
阅读全文
posted @
2008-11-02 19:20 x.matthew 阅读(2496) |
评论 (1) |
编辑 收藏
摘要: 虽然目前Glassfish V3离正式发布还需要一段时日,但针对V3版这么长久的发布日期,就让人特想认识一下V3版将会给我带来怎么样的新特性。
*组件化架构(OSGi Based Modular architecture)
*可插拔式容器与动态脚本语言支持:
*增强后的命令行模式与管理控制平台:
*基于角色的安全策略支持:
*支持用于内置服务器方式部署:
*提供让人耳目一新的问题剖析框架:
*REST 支持(Jersey):
阅读全文
posted @
2008-10-30 19:37 x.matthew 阅读(2796) |
评论 (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 阅读(2638) |
评论 (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 阅读(74728) |
评论 (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 阅读(3841) |
评论 (7) |
编辑 收藏
摘要: 本人早期整理的Java工具类学习笔记
阅读全文
posted @
2008-10-25 20:21 x.matthew 阅读(4076) |
评论 (7) |
编辑 收藏
期待了好久了,终于等到了规范的正式的发布。下面官方发布信息,记录了JSR 311规范从筹备到发布的历程。
|
![](http://jcp.org/images/common/trans.gif) |
![](http://jcp.org/images/common/trans.gif) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 //![](http://www.blogjava.net/Images/dot.gif)
9 return new Account(name, balance);
10 }
11
12 @GET
13 @Path("/account/{name}")
14 public Account getAccount(@PathParam("name") String name) {
15 //![](http://www.blogjava.net/Images/dot.gif)
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 阅读(5866) |
评论 (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 阅读(3280) |
评论 (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 阅读(3077) |
评论 (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 阅读(647) |
评论 (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 阅读(2108) |
评论 (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 阅读(2844) |
评论 (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.class, 1);
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 阅读(4778) |
评论 (4) |
编辑 收藏
摘要: 今天在网上看到一个用Memcached作为Hibernate二级分布式缓存,感觉挺有兴趣,就是尝试用了,感觉还不错,就推荐给大家看一下。
阅读全文
posted @
2008-08-20 16:43 x.matthew 阅读(14899) |
评论 (11) |
编辑 收藏
摘要: 引子: VB6是一种比较早的高级语言,但可以说在它那个时代非常流行,本人就遇到不少项目用该语言进行开发,但随着Java, .net等其它新语言的发展,VB6已经渐渐淡出了,但不少其开发的项目却被保留了下来。目前遇到的一个困扰就是这样的系统如何解决与新语言开发的系统的数据交互问题。本文就先抛一个话题,VB6实现基于HTTP Web调用来解决与基于B/S架构的应用程序间的调用(示例使用Java开发)。
阅读全文
posted @
2008-08-19 08:50 x.matthew 阅读(5588) |
评论 (1) |
编辑 收藏
《美国数学月刊》登载了一个有趣的数学问题:3名男子参加一个以气球为目标的投镖游戏。每个人都用飞镖攻击另外2个人的气球,气球被戳破的要出局,最后幸存的是胜者。
3名选手水平不一,在固定标靶的测试中,老大10投8中,命中率80%。老二和老三的命中率分别为60%和40%。现在,3个人一起角逐,谁最有可能获胜?
答案看似简单,投得准的会取胜。而实际上,一开场,每个人都希望先把另外2个对手中的强者灭掉,自己才安全,下面的比赛也轻松。于是,老大专攻老二,老二、老三就攻老大,结果,水平最高的老大最易出局,水平最差的老三最安全!
老大自然不会那么蠢,他会游说老二:“我们合伙把老三那小子灭了,这样,你我胜率都高!”
但是,老二会这样想老大:“你想得美!若我们灭了老三,然后对打,我还不是处在劣势?”
老大和老二的合作有了裂痕。
耶鲁大学煺研究所的经济学教授马丁·苏比克,讨论过另一种策略:“老大会对老二保持一种威慑:‘我不攻击你,你也别攻击我,否则,我将不顾一切地回击你!’这样一来,就会造成新的局面。老二岂肯善罢甘休,也会以同样的方式威胁老三,那么,三人的胜率又是……”
若2个男人比赛,问题再简单不过;若多出1人,问题就复杂了许多倍。
摒弃复杂的数学和社会问题,还原为一些简单的生活道理:面对一个强者,弱者只能接受失败;面对一群强者,弱者反而有了更多的周旋空间。
posted @
2008-08-09 16:19 x.matthew 阅读(602) |
评论 (3) |
编辑 收藏
摘要: 今天在DZone网站看到发布两个新的笔记帮助卡片,下载看一下感觉很不错,所以推荐给大家。不过除了今天要推荐的 Design Patterns和GlassFish以外,DZone RefCards还有很多不错的学习笔记卡片可供下载,有兴趣的朋友可以去官网下载。
阅读全文
posted @
2008-07-18 12:58 x.matthew 阅读(1452) |
评论 (4) |
编辑 收藏
摘要: 声明:本博客属作者原创,如果任何网站转载本文,请注明作者及引用来源,谢谢合作!
关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍。如果不清楚的,那只能等我把single sign on这块整理出来后再了解了。当然去cas官方网站也是有很多的文章进行介绍。cas官网http://www.ja-sig.org...
阅读全文
posted @
2008-07-09 22:44 x.matthew 阅读(31733) |
评论 (13) |
编辑 收藏
摘要: 推荐一本使用Java开源工具实践XP经验的书籍,书名有点长
Java-Tools-for-Extreme-Programming-Mastering-Open-Source-Tools-Including-Ant-JUnit-and-Cactus
全书包括三大部分
1. 介绍敏捷开发的概念。包括原则和最佳实践。
2. 开源工具的介绍。涵盖的工具应用有自动化构建,持续集成,自动化测试(功能和压力性能),部署以及代码重构等。
3. API介绍。从编程方面来剖析这些开源工具是如何工作的。
阅读全文
posted @
2008-07-08 21:17 x.matthew 阅读(1572) |
评论 (5) |
编辑 收藏
摘要: Eclipse官方网站已经正式宣布 Eclipse 3.4发布,代号为ganymede (Ganymede (英语发音"GAN uh meed")为最大的木星已知卫星,也是第七颗发现的木星卫星,在伽利略发现的卫星中离木星第三近)。
阅读全文
posted @
2008-06-25 15:22 x.matthew 阅读(3497) |
评论 (5) |
编辑 收藏
摘要: Eclipse官方网站已经正式宣布 Eclipse 3.4的发布日期为2008年6月25日
阅读全文
posted @
2008-06-23 20:01 x.matthew 阅读(2231) |
评论 (2) |
编辑 收藏
期待了好久,firefox3.0已经正式发布了,官方地址及下载链接:
http://www.mozilla.com/en-US/firefox/
本人下载后简单尝试了一下,感觉速度上有提升,而且导航栏的自动完成功能用起来很舒服。
有一点需要注意的事,如果是从firefox2.0直接升级到3.0需要注意一点,就是firefox的插件版本兼容问题。
我就发现firebug插件就存在版本的兼容问题,firebug是针对 firefox2和firefox3分别开发的,所以如果升级完后,会发布原来的firebug插件未被识别,解决办法就是
重新下载一下插件并安装。
接下来的时间会更新的尝试一下firefox3,也希望能与大家交流一下使用感觉。
Good Luck!
Your Matthew!
posted @
2008-06-19 10:10 x.matthew 阅读(1156) |
评论 (0) |
编辑 收藏
交朋友的11个技巧
交朋友有很多方法,我们有很多人也自觉不自觉地有很多交朋友的技巧,有些人甚至有交往朋友的原则。但是很多人是用朴素的方法与人交往,或者不自觉地运用或者不运用一些技巧。这里我和大家分享的11个小技巧,供大家社交参考。
——聊天聊点长远的事。我们一般与人在一起聊天的时候,除了鸡毛蒜皮,家长里短的事情之外,我们要让人觉得有一点远见,有在考虑未来的事情,自己是一个可以有长期交往价值的人。让人感到你是有长远考虑的人才增加人们与你建立鸡毛蒜皮以外关系的空间。
——交往一些眼前无用的人。有地位有资源的人谁都想去交往,但是在人家眼里你可能都不算一根葱。那些从还看不出谁长谁短的时代发展的同学关系却在后来成
为了很长久的社会支撑。我们要把一部分精力放在帮助这些现在没有很多功用的人,从而为未来积累真正的价值。实际上那些只交往有用朋友的人看起来更象小人。
——注意社交的差异性。有的人说我从没有公务员的朋友,或者从来没有教授的朋友,没有做投资股票这些方面的朋友,那么我要有意识的去这些人可能较多出现的场合、讲座、活动中去交往这些朋友。假如我要交往一个投资界的朋友的话,说不定在投资讲座的时候可以交到这个人。
——不要随便给人家承诺。如果承诺的话是指100%可以做到的,你可以不承诺,可能面子上抹不开。我有一个规矩第一我不借人钱,亲戚朋友只有一个例外,
你们生了大病我都会帮助的,我承诺做到的都能做到,我说不借的就不借。清晰的承诺可以减少你的麻烦,也可以让其他人知道怎么和你打交道。
——
接近不知道或不喜欢的知识或人士。在这个不知道里面,你可能会发现这些人事其实才是我非常喜欢的。有时你还要接触一些不喜欢的人和知识——中学,高中包括
到大学是我们人生最开放的时候,一个很重要的原因,是中小学到大学的时候我们学到很多知识是不得不学的。等到我们工作以后,老得快的一个重要原因是因为只
选择自己喜欢的东西,从而变得十分偏执。所以如果你选10本书,你选三本你不喜欢的书,七本是你喜欢的。如果你能这样坚持,你将对未来保持开放心态。
——在没事的时候联络老朋友。大家打招呼,说有事来找我,而社交的规矩是没事情的时候找人才能积累情感与彼此的粘合度,有事找人是用人,没事找人是情感投资。我们要更多在没有事情的时候给人电话、吃饭、聚会与旅行。
——做成本低但让人感觉到你的关心的事。过中秋买三千块钱的月饼,这个不见得有必要,而今天这个时代还能手写信,所以你过一个节给你30个朋友一人写一
个小短信的话,比你那个肉麻的印的卡片要好。所以你哪怕用最朴素的方法报告一下你的情况,也比转一个人家已经收到过的定制短信好。
——组织聚会扩大关系。一家人老公有老公的朋友,太太有太太的朋友,小孩子有小孩子的朋友,如果大家的朋友带朋友一起聚会,就可以把社交关系扩大很多倍,而且还发展了与家人可共享的友谊关系,增加了共同的话题,也在有事情的时候制造了可以与大家都说得上话的人力资源。
——关心自己给人的第一形象。现在大家不像以往,交往机会多了,但其实人们很难有第二次交往,大部分人连一次见面的机会都不会有,我们在超级市场推着一
个货车,选东西的时候很多东西不认真看的,顺手这么一拿,扫一眼就可以判断,而我们现在人际社交中间很多不是扫一眼就可以判断的。所以为什么像我们面试
啊,会议啊,论坛啊,你要认真的考虑我的形象怎么样?第一要吸引人们的注意力,第二个人们对我的注意力是正面的。要充分注意形象的修饰。
——
一定要用名片。人初次见面后需有一个沟通的链接,名片就充当这样一个作用。假如今天是龙永图在这边做演讲,你说龙先生我们能不能换一个名片,他会说不好意
思我今天没有带名片,这是他的亏欠,因为他没有给你名片。大家在名片上也不要印手机号,你在他面前写下了一个号码,你写这个东西的姿态表明你对他另眼相
看。
——与朋友一起做公益。我们这些朋友我们除了互相帮忙之外,很重要一点就是把我们的友谊和关系用在帮助第三人和第四人方面。在这一种交往
中间因为你帮助了他们,所以新的得到帮助的人对你还是负有社会债务的,更重要的是使得我们能够体验到那种帮助其他人,服务于其他人,为更多人创造价值这个
中间的乐趣。还不会减少原来的友情。
Good Luck!
Yours Matthew!
posted @
2008-06-13 19:24 x.matthew 阅读(416) |
评论 (2) |
编辑 收藏
关于endpoint配置补充
endpoint配置相对比较灵活,下面再来看一个例子:
<endpoint input-channel="inputChannel"
default-output-channel="outputChannel"
handler-ref="helloService"
handler-method="sayHello"/>
<beans:bean id="helloService" class="org.springframework.integration.samples.helloworld.HelloService"/>
1 public class HelloService {
2
3 public String sayHello(String name) {
4 return "Hello " + name;
5 }
6 }
上面这个例子就演示了把 HelloService配置成一个MessageEndpoint组件,消息从"inputChannel"队列接收后,
调用HelloService.sayHello方法,等sayHello方法返回后,根据default-output-channel="outputChannel"的配置
把返回的结果保存到message.payload属性后发送给"outputChannel"队列
也可改成Annotation的方式,配置方法如下:
<annotation-driven/>
<message-bus auto-create-channels="true"/>
<context:component-scan base-package="org.springframework.integration.samples.helloworld"/>
<beans:bean id="helloService" class="org.springframework.integration.samples.helloworld.HelloService"/>
1 @MessageEndpoint(input="inputChannel", defaultOutput="outputChannel")
2 public class HelloService {
3
4 @Handler
5 public String sayHello(String name) {
6 return "Hello " + name;
7 }
8 }
设置并发操作属性
xml配置:
<endpoint input-channel="exampleChannel" handler-ref="exampleHandler"/>
<!-- 设置并发设置 core核心线程数 max最大线程数 queue-capacity 队列最大消息数 keep-alive idle线程生命时间-->
<concurrency core="5" max="25" queue-capacity="20" keep-alive="120"/>
</endpoint>
annotation配置
1 @MessageEndpoint(input="fooChannel")
2 @Concurrency(coreSize=5, maxSize=20, queueCapacity=20, keepAliveSeconds=120)
3 public class FooService {
4
5 @Handler
6 public void bar(Foo foo) {
7 ![](http://www.blogjava.net/Images/dot.gif)
8 }
9 }
下面总结一下常见的annotation的使用方法
@MessageEndpoint
它表示处理消息对象的终端节点。一般与其它的元数据标记一起使用。
下面会具体介绍与该元数据标记一起使用的其它标识的使用方法。
@MessageEndpoint源代码:
1 @Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 @Component
6 public @interface MessageEndpoint {
7
8 String input() default ""; //接收消息的队列名称
9 String defaultOutput() default ""; //默认发送消息的队列名称(只有在不设置@Router情况下才有效)
10 int pollPeriod() default 0; //发送消息的轮循时间间隔(只有在不设置@Router情况下才有效)
11 }
@Handler
消息回调处理的方法。与@MessageEndpoint一起配置
(只限M3版,M4以及后续版本可以单独使用,具体使用方法还要等具体的实现出来),收到input队列的消息后,回调@Handler标识的方法
回调方法的参数类型必须与message.payload属性类型相同
注:如果回调方法有返回值, 则回调方法处理完成后,会将返回值设置到message.payload属性后,
发送消息到@MessageEndpoint的defaultOutput队列。如果defaultOutput没有设定,则将抛出异常。
@Handler源代码:
1 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 public @interface Handler {
6
7 }
下面的例子演示了,从"channel1"队列接收消息后由@Handler标记的方法处理。消息的payload属性值的类型必须与方法的参数类型相同
1 @MessageEndpoint(input="channel1")
2 public class FooService {
3
4 @Handler
5 public void bar(Foo foo) {
6 ![](http://www.blogjava.net/Images/dot.gif)
7 }
8 }
@Polled
必须与@MessageEndPoint 一起使用。但也可以与@Router,@Splitter标识配合使用,后面再分别举例说明。
@Polled 用于开启一个轮循的方式调用方法的功能
它有三个参数:
period: 轮循时间间隔(单位:微秒) 默认为 1000
initialDelay: 轮循延迟时间(单位:微秒) 默认为0
fixedRate: 默认为false
@Polled 源代码
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Inherited
4 @Documented
5 public @interface Polled {
6 int period() default 1000;
7 long initialDelay() default PollingSchedule.DEFAULT_INITIAL_DELAY;
8 boolean fixedRate() default PollingSchedule.DEFAULT_FIXED_RATE;
9
10 }
下面来看几个例子:
例子1:
1 @MessageEndpoint(defaultOutput="outputChannel")
2 public class Counter {
3
4 private AtomicInteger count = new AtomicInteger();
5
6 @Polled(period=3000)
7 public int getNumber() {
8 return count.incrementAndGet();
9 }
10 }
这个例子功能是,MessageBus启动后,由@Polled标记 每3秒触发getNumber方法,当getNumber方法返回后,
把返回值设置到message.payload属性后,发送到outputChannel队列中。
例子2:
1 @MessageEndpoint
2 public class Counter {
3
4 private AtomicInteger count = new AtomicInteger();
5
6 @Polled(period=3000)
7 public int getNumber() {
8 return count.incrementAndGet();
9 }
10
11 @Router
12 public String resolveChannel(int i) {
13 if (i % 2 == 0) {
14 return "even";
15 }
16 return "odd";
17 }
18 }
这个例子功能是,MessageBus启动后,由@Polled标记 每3秒触发getNumber方法, 当getNumber方法返回后,
由于resolveChannel方法设置了@Router 标识,则把有getNumber方法返回值都会传给resolveChannel方法,最后
会根据方法的返回值(即队列名称) (@Router标记功能),把消息发到even队列或是odd队列
注:如果@MessageEndpoint类中,在方法上标记了@Router标记后,@MessageEndpoint的defaultOutput就变成无效了。
@Splitter
必须与@MessageEndPoint 一起使用。
该元数据标识用于分解消息内容,它所在的方法的返回值必须是一个集合(collection).如果集合元素不是Message类型
但发送时,自动把集合中的元素对象保存到Message.payload属性后发送。集合中有多少个元素,则会发送多少次消息。
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Handler
5 public @interface Splitter {
6 String channel(); //消息发送的队列名
7 }
下面两个例子实现效果是一样的
例子1
1 @MessageEndpoint(input="inputChannel")
2 public class HelloService {
3
4 @Splitter(channel="outputChannel")
5 public List<String> sayHello(String name) {
6 String s = "Hello " + name;
7 List<String> list = new ArrayList<String>();
8 list.add(s);
9 return list;
10 }
11 }
12
例子2
1 @MessageEndpoint(input="inputChannel")
2 public class HelloService {
3
4 @Splitter(channel="outputChannel")
5 public List<Message> sayHello(String name) {
6 String s = "Hello " + name;
7 List<Message> list = new ArrayList<Message>();
8 Message message = new GenericMessage<String>(s);
9 list.add(message);
10 return list;
11 }
12 }
@Router
消息队列路由功能。 必须与@MessageEndPoint 一起使用。
它所在的方法的返回值类型必须是MessageChannle或是String(channel name)类型
具体的例子参考上面。
@Publisher
必须与@MessageEndPoint 一起使用。
说明:@Publisher 标识是根据 after-returning 切面的AOP 在方面返回值时,发送消息到指定消息队列 .
下面的例子:说明 foo方法调用后,返回值会发送到fooChannel消息队列
1 @Publisher(channel="fooChannel")
2 public String foo() {
3 return "bar";
4 }
@Subscriber
必须与@MessageEndPoint 一起使用。
接收指定队列的消息内容。它实现的异步的消息监听事件。
一旦有消息接收到,则会根据message.payload 值作为参数,回调@Subscriber 标识标记的方法
1 @Subscriber(channel="fooChannel")
2 public void log(String foo) {
3 System.out.println(foo);
4 }
Good Luck!
Yours Matthew!
2008年4月24日
posted @
2008-05-28 21:38 x.matthew 阅读(1984) |
评论 (1) |
编辑 收藏
摘要: The Cafe Sample(小卖部订餐例子)
小卖部有一个订饮料服务,客户可以通过订单来订购所需要饮料。小卖部提供两种咖啡饮料
LATTE(拿铁咖啡)和MOCHA(摩卡咖啡)。每种又都分冷饮和热饮
整个流程如下:
&nb...
阅读全文
posted @
2008-05-28 11:49 x.matthew 阅读(8607) |
评论 (6) |
编辑 收藏
摘要: 据上次发布的M3版本已经相隔有一个多月了,终于盼来了 M4版本。
下面的官方发布地址
Spring Integration 1.0 Milestone 4 Released
随着目前企业所开发的系统的数据量和之间的关联程度越来越大,接下来面临的一大难题就是如何把这些个体的系统能有效的、灵活的集成起来。目前业内也推出一些好的方案和设计思想,
阅读全文
posted @
2008-05-28 10:03 x.matthew 阅读(1191) |
评论 (3) |
编辑 收藏
摘要: 注:例子的原作者是 Paul Feuer和John Musser,我在上面加入些注释以便更好的理解Jaas的实现
首先,我们来看一下 JAAS 一个认证操作的实现流程
先看一下这个认证操作会使用的接口如下:
javax.security.auth.callback.CallbackHandler
javax.security.auth.spi.LoginModule
下面看...
阅读全文
posted @
2008-05-28 09:27 x.matthew 阅读(2666) |
评论 (2) |
编辑 收藏
今天在Spring官方文档看到 Dzone发布了Spring2.5配置文档帮助卡片(Spring 2.5 Configuration Reference Card)。 本人下载看一下,觉得还挺不错,推荐给大家。
该卡片提供比较详细介绍了spring2.5 xml的配置,包括以下四部分
- XML elements available as of Spring 2.5(Spring2.5 xml标签配置)
- Most commonly used elements(常用的xml标签使用方法)
- Namespaces(命名空间)
- Guide to Spring’s rich set of annotations(Spring支持的annotations技术使用指南)
官方下载地址
下面是官方发布的内容的原文
http://www.springframework.org/node/660
DZone has just published a reference card for
Spring 2.5 Configuration. The card was written by the very knowledgeable
Craig Walls and provides exhaustive details about all the XML configuration options for your
Spring 2.5
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
annotation based configuration.
posted @
2008-05-23 08:51 x.matthew 阅读(2813) |
评论 (2) |
编辑 收藏
摘要: 这个话题起源于“钱是否是万恶的”这句话。有人说钱少对穷人是万恶,有人说钱多对富人也是万恶的。
所以这个是一个调查,测试一下大家有钱后,是第几等幸福的人?
阅读全文
posted @
2008-05-19 08:21 x.matthew 阅读(527) |
评论 (2) |
编辑 收藏
由于本人喜好,对firefox一向是情有独钟。所以借此机会向大家分享两个比较实用插件(本人使用有段时间了,比较好用)。
FireFTP 一个ftp客户端。它与其它的ftp客户端使用方法都差不多,使用也很简单,用法就不详细介绍了,
下面是几张截图,让大家来看一下。
在线安装地址
https://addons.mozilla.org/en-US/firefox/addon/684
Server Spy 一个用于识别访问的web服务器类型,版本以及IP地址的插件
在线安装地址
https://addons.mozilla.org/en-US/firefox/addon/2036
这个就更简单了,下面是一张截图,显示了 blogjava.net使用的服务器的类型,版本和IP
个人觉得firefox现在用得人多起来了后,其对应的实用的插件也多了,相信firefox将来一定会发展得更好的。
Good Luck!
Yours Matthew!
2008年5月12日 21:12:46
posted @
2008-05-12 21:13 x.matthew 阅读(3480) |
评论 (5) |
编辑 收藏
摘要: 有段时间没有更新了,今天上来与大家打声招呼先。Spy2servers这个项目自发布以来,受到不少的朋友支持,在此表示感谢。
经过一段时间的整理,现已经把整个项目转移到了SourceForge。目前的网址为 https://sourceforge.net/projects/spy2servers 希望大家能依旧大力支持。
言归正转,此次更新主要是支持Annotation,用于简单Spring的xml配置
阅读全文
posted @
2008-05-05 22:49 x.matthew 阅读(1734) |
评论 (2) |
编辑 收藏
摘要: Spring Security 2.0.0 Released 在4月15号发布不久,Spring Security开发小组紧接着发布了2.0.1版本
该版本主要是修改前一版本的缺陷为主,但也提供了OSGi相关方面的一些功能提升,扩展的命名空间配置支持和
使用增强的加密令牌功能。
阅读全文
posted @
2008-05-04 08:35 x.matthew 阅读(1754) |
评论 (1) |
编辑 收藏
摘要: 前一篇文章已经把spy2servers的用户使用手册整理出来了,这次更新主要是把开发手册部分的整理。
如果没有下载的朋友可以从下面下载spy2servers。
1. 下载
下载地址:
二进制程序
第三方类库下载,第三方类库下载2 Jetty类库 放到lib目录下。
api-docs
源代码
开发手册:
spy2servers对外提供三个组件接口,分别...
阅读全文
posted @
2008-04-25 22:47 x.matthew 阅读(3606) |
评论 (18) |
编辑 收藏
spy2servers项目发布后,得到很多朋友的支持,本人在此表示感谢。本次更新,主要实现了内置了Jetty Web服务器,提供
基于web方式查看监控平台的所有组件运行状态。针对原来提供的基于JMX的运行状态监控相比,Web方式要方便很多,无需运行jconsole。
下载地址:
二进制程序
第三方类库下载,
第三方类库下载2 Jetty类库 放到lib目录下。
api-docs
源代码
我来看一下如何在 spy2servers 配置Jetty并启动web方式的组件监控服务。
配置方法非常简单,使用我们简单后的Spring配置。下面是配置说明,在spy2servers.xml中,加入
<jetty>
<connectors>
<nioConnector port="7758" /> <!-- using nio connector port is 7758 -->
</connectors>
<handlers>
<!-- org.xmatthew.spy2servers.component.web.ComponentsViewServlet is our web spy servlet, /admin is our servlet path -->
<servlet servletClass="org.xmatthew.spy2servers.component.web.ComponentsViewServlet" path="/admin" />
</handlers>
</jetty>
配置是不是非常的简单, 这样就启动了web服务 访问址
http://localhost:7758/admin。 使用的是7758端口,servlet path是/admin.
下面看一下,进入后页面的内容:
最上面分别是三个标签:分别选择查看
SpyComponents AlertComponents ChannelAwareComponents 三种组件组件。默认进入的是
SpyComponents
上面图片中,我们可以看到SpyComponents类共配置了三个监控组件。
我们拿其中一个再说明一下:
ActiveMQJmxSpyComponent
message count=0 #监控消息个数
component status=Active #组件的状态
startup date=2008-04-22 22:25:09 #组件启动的时间
如果有消息监控到,则会显示如下:
ActiveMQJmxSpyComponent
message count=2
component status=Active
startup date=2008-04-22 22:25:09
order |
1 |
id |
c7c41f6b-a502-4656-862b-869e1dbe8260 |
level |
1 |
body |
Test.Queue |
description |
QueueConsumerSuspend |
type |
QueueInspect |
properties |
{Name=Test.Queue,
MemoryPercentageUsed=0, DispatchCount=0, QueueSize=0, EnqueueCount=0,
DequeueCount=0, ConsumerCount=0, MemoryLimit=9223372036854775807,
statusKeepTime=18968} |
|
order |
2 |
id |
a5b0dbce-b0ae-41d6-8690-0d0ebf9a34b5 |
level |
1 |
body |
aaa |
description |
QueueConsumerSuspend |
type |
QueueInspect |
properties |
{Name=aaa,
MemoryPercentageUsed=0, DispatchCount=0, QueueSize=0, EnqueueCount=0,
DequeueCount=0, ConsumerCount=0, MemoryLimit=9223372036854775807,
statusKeepTime=18796} |
|
接下来,细心的朋友发现还有一个AlertRule链接,这个又不是组件,这个是做什么的呢?
现在我来解释一下,我们在定义core-componet标签的时候,平台支持定义消息的流转规则,下面这是可视化的标识哪些消息从那个监控
组件过来,将会发送到哪个报警组件消息上去
下面是一个演示界面:
Components alert rule:
from |
to |
AMQ16Component |
PrintScreenAlertComponent
|
ActiveMQJmxSpyComponent |
PrintScreenAlertComponent
EmailAlertComponent
|
SunJVMJmxSpyComponent |
PrintScreenAlertComponent
EmailAlertComponent
|
TomcatJmxSpyComponent |
PrintScreenAlertComponent
EmailAlertComponent |
其中的内容很好解理,from就是指监控组件, to指的就是报警组件。
基于web方式的查看监控的组件情况,是不是很方便呢 :)。
最后欢迎大家如果有问题和意见,给我留言。
Good Luck!
Yours Matthew!
posted @
2008-04-24 09:36 x.matthew 阅读(2985) |
评论 (1) |
编辑 收藏
经常在开发过程,因为使用到比较多的类库(jar文件),在开发时经常会找不到需要的类文件存放在哪个jar文件中,这时classlocator这个插件
就带我们带来极大的方便,可以帮我很快速的找到我们需要的类库在哪个jar文件中。
classlocator使用非常简单,只需简单讲一下就会使用。
1. 下载
classlocator 官方下载地址(最新版本1.0.8)
http://sourceforge.net/projects/classlocator/ 也可以从
本地下载
2. 安装
classlocator插件安装也很方便,直接解压到 eclipse的plugins目录即可。
安装完成后,打开eclipse,会发现在式具栏会多出一个图标.表示已经安装完成。
3.使用方法
首先要告诉classlocator插件,我们的类库文件在哪里。classlocator支持单个文件的指定和目录的指定。可以批定多个。
打开菜单 windows->Preferences 找到 Class/Jar Locator,在右边填加我们目录或是具体的类库。如下图所示
配置完成后,我们就是在工具栏上,点击那个小图标,输入要查找的类名即可,找到后,选中类库文件点击"finish"就引用到项目中了。
注:目前不支持* ?通配符。
使用就是这么简单,如有什么问题可以留言给我。
Good Luck!
Yours Matthew!
posted @
2008-04-23 20:22 x.matthew 阅读(9595) |
评论 (21) |
编辑 收藏