posts - 156,  comments - 601,  trackbacks - 0
            2008年8月19日
               摘要: 1. Springboot config示例與原理介紹1.1 Springboot config示例Springboot給我們提供了非常便捷與方便的配置使用方式,常用的使用示例有以下兩種:1)使用@ConfigurationProperties 讀取多個屬性使用方法:@ConfigurationProperties(prefix = "spring.datasource")使用說明:提供...  閱讀全文
          posted @ 2021-04-08 20:00 x.matthew 閱讀(537) | 評論 (0)編輯 收藏
               摘要: jprotobuf-rpc-http 是應用jprotobuf類庫實現基于http協議的RPC開發組件。 目前1.0提供可以直接把Google protobuf的IDL定義語言發布成RPC服務,客戶端也可以直接應用IDL定義語言進行動態創建,幫助開發完全省去了手工編譯protobuf IDL語言的麻煩。  閱讀全文
          posted @ 2014-10-10 15:20 x.matthew 閱讀(3549) | 評論 (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 閱讀(4909) | 評論 (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 閱讀(6319) | 評論 (9)編輯 收藏
               摘要: CyclicBarrier一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。假如在涉及一組固定大小的線程的程序應用中,要求這些線程必須不時地互相等待(保證所有線程都執行完畢才返回),那么選擇 CyclicBarrier 就會讓這個實現變得非常容易。CyclicBarrier 在釋放等待線程后可以重用,所以又稱它為循環 的 barrier。  閱讀全文
          posted @ 2012-06-28 13:34 x.matthew 閱讀(2754) | 評論 (1)編輯 收藏
               摘要: 本文通過對Apache Commons Collections 項目中LRUMap這個集合類的源代碼進行詳細解讀,為幫助大家更好的了解這個集合類的實現原理以及使用如何該集合類。
          首先介紹一下LRU算法. LRU是由Least Recently Used的首字母組成,表示最近最少使用的含義,一般使用在對象淘汰算法上。也是比較常見的一種淘汰算法。  閱讀全文
          posted @ 2012-06-28 13:34 x.matthew 閱讀(5854) | 評論 (1)編輯 收藏
               摘要: Treap=Tree+Heap。Treap本身是一棵二叉搜索樹,它的左子樹和右子樹也分別是一個Treap,和一般的二叉搜索樹不同的是,Treap記錄一個額外的數據,就是優先級。Treap在以關鍵碼構成二叉搜索樹的同時,還按優先級來滿足堆的性質(在這里我們假設節點的優先級大于該節點的孩子的優先級)。但是這里要注意的是Treap和二叉堆有一點不同,就是二叉堆必須是完全二叉樹,而Treap可以并不一定是。  閱讀全文
          posted @ 2012-05-16 14:37 x.matthew 閱讀(4294) | 評論 (0)編輯 收藏
               摘要: 對于Mybatis 擁有的Lazy Load(有中文翻譯成延遲加載)功能,應該很同學都有聽說過,今天主要與大家一起來解讀一下Mybatis在Lazy Load功能的實現的代碼。Lazy Load實現的功能很好理解,就是在數據與對象進行Mapping操作時,只有當真正使用該對象時,才進行Mapping操作,以減少不必要的數據庫查詢開銷,從而提升了程序的效率。  閱讀全文
          posted @ 2011-12-29 19:14 x.matthew 閱讀(5037) | 評論 (1)編輯 收藏
               摘要: Thrift出自Facebook用于后臺各個服務間的通訊,Thrift的設計強調統一的編程接口的多語言通訊框架.
          本文通過一個實例來介紹一下Thrift最基本的應用。  閱讀全文
          posted @ 2011-11-12 18:57 x.matthew 閱讀(17898) | 評論 (4)編輯 收藏
               摘要: JDK Proxy AOP實現與Cglib Proxy AOP實現對比。  閱讀全文
          posted @ 2011-10-10 19:24 x.matthew 閱讀(5022) | 評論 (1)編輯 收藏
               摘要: 在SQL開發過程中,動態構建In集合條件查詢是比較常見的用法,在Mybatis中提供了foreach功能,該功能比較強大,但由于官方文檔對這塊的使用,描述的比較簡短,細節上也被忽略掉了(可能是開源項目文檔一貫的問題吧),也使用不少同學在使用中遇到了問題。特別是foreach這個函數中,collection屬性做什么用,有什么注意事項。由于文檔不全,這塊只能通過源代碼剖析的方式來分析一下各個屬性的相關要求。  閱讀全文
          posted @ 2011-08-31 14:38 x.matthew 閱讀(50562) | 評論 (4)編輯 收藏
               摘要: 本文主要介紹什么是API,以及API兼容的重要性,最終給出方案如何評估API,以及如何做到API兼容。  閱讀全文
          posted @ 2011-07-29 19:35 x.matthew 閱讀(578) | 評論 (0)編輯 收藏
               摘要: Spring聲明式事務功能應該是大家應用Spring中使用的最多的功能之一了,的確該功能極大的簡化了大家對數據庫操作的。目前Spring支持的聲明式事務有兩個配置方式,一種是XML配置方式,另一種是注解方式

          針對配置這塊,XML配置同學們會覺得比較麻煩,特別是針對事務屬性的配置,所以補充一下本塊配置說明,特分享給大家,希望對大家有幫助。  閱讀全文
          posted @ 2011-06-23 13:25 x.matthew 閱讀(4387) | 評論 (3)編輯 收藏
               摘要: 本月Tomcat 7.0.14版本正式發布,其最顯著的一個新功能就是引入了StuckThreadDetectionValve功能,該功能可以幫助分析和檢查耗時的請求或潛在可能會出現請求線程阻塞等情況  閱讀全文
          posted @ 2011-05-25 21:51 x.matthew 閱讀(3059) | 評論 (4)編輯 收藏
               摘要: 本文章會通過連載的方式來深入了解和學習Spring相關核心技術和實現原理。包括Spring的Bean生命周期管理,聲明性事務管理,AOP管理,注解應用實現,以及在其上面進行擴展的相關應用。

          本篇技術文章將介紹Spring聲明式事務管理實現技術細節的剖析。  閱讀全文
          posted @ 2011-04-29 10:54 x.matthew 閱讀(2186) | 評論 (1)編輯 收藏
               摘要: 講起靜態代碼分析工具,估計大家耳熟能詳的都能講出幾個來,像PMD, Checkstyle, Findbug等。沒錯這些都是我們日常編碼代碼時用于提升我們代碼質量的好工具,本文將從PMD工具實現的規則出發,通過這些規則的定義來學習一下代碼優化的技巧,希望通過這些技巧的介紹可以幫助大家在編碼過程中提升大家的代碼編寫質量。同時也算給大家介紹一個比較不錯的途徑去學習改進代碼編寫質量的方法。  閱讀全文
          posted @ 2011-04-29 10:54 x.matthew 閱讀(2361) | 評論 (2)編輯 收藏
               摘要: 本文章會通過連載的方式來深入了解和學習Spring相關核心技術和實現原理。包括Spring的Bean生命周期管理,聲明性事務管理,AOP管理,注解應用實現,以及在其上面進行擴展的相關應用。

          本篇技術文章介紹Spring AOP的實現。  閱讀全文
          posted @ 2011-04-01 10:52 x.matthew 閱讀(2353) | 評論 (0)編輯 收藏
               摘要: 本塊文章會通過連載的方式來深入了解和學習Spring相關核心技術和實現原理。包括Spring的Bean生命周期管理,聲明性事務管理,AOP管理,注解應用實現,以及在其上面進行擴展的相關應用進行介紹。

          本篇技術文章將作為Spring入門篇。
            閱讀全文
          posted @ 2011-03-14 19:24 x.matthew 閱讀(2450) | 評論 (3)編輯 收藏
               摘要: 本文是針對 之前的通過Spring2.5對單元測試的Annotation支持進行TDD開發 進行擴展,增加了Struts Action層的測試實現。雖然Action沒有注入到Spring容器,也可以通過 getProxyAction方法,實現Spring容器的屬性依賴注入實現  閱讀全文
          posted @ 2011-02-27 19:15 x.matthew 閱讀(1941) | 評論 (2)編輯 收藏
               摘要: 介紹:
          Hibernate Envers目的是根據對實體的設置,提供記錄執行數據變更歷史的功能(數據變更版本)。它實現原理是通過對Hibernate的操作事件監聽并根據
          基于Annoatation的配置來記錄修改數據的內容。  閱讀全文
          posted @ 2010-08-22 23:20 x.matthew 閱讀(9423) | 評論 (1)編輯 收藏
               摘要: 在上篇博客中,介紹了如何借助Spring Module項目,配置聲明式緩存功能實現,文中只針對Ehcahce的實現進行了講解,其它Spring Module項目把這塊的功能做了一個很好的抽取,使其能更好的對其它的緩存框架的支持和擴展。筆者正好利用該代碼框架實現了與Memcached服務的集成,本文將得點通過源代碼解講一下抽取這層的實現,希望大家有所幫助。  閱讀全文
          posted @ 2010-05-13 19:53 x.matthew 閱讀(4457) | 評論 (2)編輯 收藏
               摘要: 前言:
          如果大家使用過Spring事務管理,會發現Spring提供的事務分為“只讀”和“讀寫”事務兩類。這不免就會疑問這兩種事務會有什么不同?本文則通過對Spring和Hibernate源代碼的剖析來找出這兩種事務的區別。特別是運行性能方面的區別。
          文章調試使用的版本為 Spring 2.5.6.SEC01 ,Hibernate 3.3.2.GA。  閱讀全文
          posted @ 2010-05-06 19:31 x.matthew 閱讀(6048) | 評論 (1)編輯 收藏
               摘要: 本筆記針對Spring-dynamic 1.2.0版本進行一個簡單開發應用講解,使用Apache Felix-1.8.0作為osgi運行環境。  閱讀全文
          posted @ 2010-04-29 19:08 x.matthew 閱讀(4539) | 評論 (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 閱讀(3294) | 評論 (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 閱讀(2534) | 評論 (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 閱讀(1626) | 評論 (0)編輯 收藏
               摘要: 本示例中,應用netbeans 6.0版本,演示使用Netbeans IDE自帶的Profiler工具,跟蹤Java應用程序中發生的內存泄漏問題。本人已經對文檔中的操作過程進行嘗試,的確能進行內存泄漏的定位,希望能給大家帶來幫助。并祝大家國慶,中秋雙節快樂!
          轉自: http://www.javapassion.com/handsonlabs/nbprofilermemory/  閱讀全文
          posted @ 2009-10-07 11:53 x.matthew 閱讀(2853) | 評論 (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 閱讀(4093) | 評論 (3)編輯 收藏
               摘要: 在上次發布http://www.aygfsteel.com/xmatthew/archive/2009/06/30/284825.html游戲之后收到很多人的關注,在此本人表示感謝。這次把整理后的服務器和客戶端的程序打包上傳,希望大家能喜歡玩這個游戲。  閱讀全文
          posted @ 2009-07-06 13:12 x.matthew 閱讀(3649) | 評論 (10)編輯 收藏
               摘要: 記得剛開始學習中國象棋,還不太明白象棋的規則。所以自然是下得比較糗,所以也不知道是從哪里學來了這種玩法,就是只使用半張的 棋盤空間,把紅黑兩方的棋子都反面朝下打散,然后玩家就一個個把棋子翻過來,比誰的棋子大,如果相鄰的棋子,大的一方可以把小的一方吃掉,到最后誰的棋子先被吃光,則就輸了。  閱讀全文
          posted @ 2009-06-30 19:43 x.matthew 閱讀(2272) | 評論 (10)編輯 收藏
               摘要: 針對 JDK IO部分整理的類圖
            閱讀全文
          posted @ 2009-06-13 10:38 x.matthew 閱讀(3423) | 評論 (6)編輯 收藏

            由于多年一直在使用MySQL數據庫,對其可謂感情深厚。MySQL 從發展初期到現在幾經展轉,似乎又重回到了最初的開創時期的階段。不同的是它不在稚嫰,又是更加成熟,發展的更加穩健。祝愿MySQL一路發展順利。

            開源數據庫聯盟: http://opendatabasealliance.com/





          Good Luck!
          Yours Matthew!
          posted @ 2009-05-15 09:23 x.matthew 閱讀(1519) | 評論 (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 閱讀(2651) | 評論 (4)編輯 收藏
               摘要: JNorm是一個Java代碼分析工具。
          它能夠探測代碼中的哪些功能可以用現存的開源項目代替,幫助提高代碼的可復用性,可維護性。
          該項目還提供一個輔助使用的Eclipse插件。  閱讀全文
          posted @ 2009-04-14 18:39 x.matthew 閱讀(1506) | 評論 (4)編輯 收藏
               摘要: 本文以javarebel-2.0 free版本為例,包括如何配置在使用Eclipse插件開發tomcat應用時,實現即時重載java class更改。  閱讀全文
          posted @ 2009-04-02 11:58 x.matthew 閱讀(2638) | 評論 (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 閱讀(1256) | 評論 (1)編輯 收藏
               摘要: 建議學習存儲技術可以分為前期準備階段、存儲新人階段、存儲老人階段、存儲高人階段和存儲牛人階段,每個階段應該學習或應該達到的目標如下  閱讀全文
          posted @ 2009-03-10 21:50 x.matthew 閱讀(695) | 評論 (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 閱讀(2696) | 評論 (2)編輯 收藏
               摘要: 本人參考官方文檔整理出來最完整的Quartz CronTrigger配置說明.  閱讀全文
          posted @ 2009-02-15 14:41 x.matthew 閱讀(72283) | 評論 (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 閱讀(7011) | 評論 (3)編輯 收藏
               摘要: iBatis Java Mapper是iBatis+Spring的一個擴展,能夠讓你使用Java類和接口來代替用于object-SQL映射的XML文檔。  閱讀全文
          posted @ 2009-01-05 21:35 x.matthew 閱讀(2807) | 評論 (0)編輯 收藏
               摘要: Spy2server項目發布至今,也有大半年了,很高興有很多的朋友在使用該項目并給本人也提供很多建議,在此表示感謝。雖然發布至今有這么長時間,但自己真得檢討,一直沒有時間對文檔進行整理,加上最近項目比較忙所以一直就拖到了現在。在元旦之際終于有時間進行整理,現在共享大家,希望大家多提些建議。當然Spy2servers項目我還會擴展下去,下一部會對Spring-integration集成,達到更好的功能擴展。  閱讀全文
          posted @ 2009-01-03 17:37 x.matthew 閱讀(2100) | 評論 (1)編輯 收藏
               摘要: svenson是一個用于生成和解析JSON數據格式的Java5開源類庫。它能夠將JSON數據集轉換成Java對象或相反的操作。  閱讀全文
          posted @ 2008-12-29 21:35 x.matthew 閱讀(3118) | 評論 (0)編輯 收藏
               摘要: 期待了許久的JSR-315(Servlet 3.0)規范終于Public Review了,這下本人估計就要熱鬧了。Public Review往往是帶來最大的討論與爭議的過程。不過還是希望JSR-315規范能盡早的敲定,讓我們這些期盼以久的開發人員能使用這些新特征。  閱讀全文
          posted @ 2008-12-25 08:44 x.matthew 閱讀(1851) | 評論 (0)編輯 收藏
               摘要: 又是一周的周未,不過最近項目一直進展不順也少了一些悠閑。不過正好,文秘下來給大家發月刊,說是刊中有一題
          考大家,前幾名回復有獎品。這可一下子讓大家一直緊張的情緒,緩和了一些了。

          下面是這個題目:

          A、B、C三人的年齡一直是一個秘密。將A的年齡數字的位置對調一下,就是B的年齡;C的年齡兩倍是A與B
          兩個年齡的差數;而B的年齡是C的10倍。請問:A、B、C三人的年齡各是多少?  閱讀全文
          posted @ 2008-12-12 22:58 x.matthew 閱讀(3547) | 評論 (23)編輯 收藏
               摘要: Simple是一個XML序列化框架,一個Java版本寬容的序列化框架,能夠快速在Java平臺上開發XML。支持通過annotations完全配置化的XML結構;提供版本管理框架允許向前和向后兼容序列化;更好的性能,使用輕量級StAX提升XML反序列化進程,比XStream和JAXB更快;通過namespace annotations提供完全的命名空間支持;包括XML模板系統  閱讀全文
          posted @ 2008-12-10 20:16 x.matthew 閱讀(3830) | 評論 (1)編輯 收藏
               摘要: 期待了許久,終于等到Spring Integration 1.0的正式發布。在些先祝賀一了Spring Source公司和Spring integration團隊。
          下面是本人爭取第一時整理的學習筆記(針對最新版本)  閱讀全文
          posted @ 2008-12-04 08:33 x.matthew 閱讀(4785) | 評論 (3)編輯 收藏
               摘要: 前一部分,通過XML的使用方式講解了The Cafe Sample(小賣部訂餐例子)
          本筆記接下講解以Annotation的方式來使用Spring-integration的例子。還是之前的那個示例:
            閱讀全文
          posted @ 2008-12-04 08:33 x.matthew 閱讀(3260) | 評論 (0)編輯 收藏
               摘要: 應該使用過Spring的人都被問題過這個問題, What is Spring?(當然不能回答春天了,呵呵)

          其實在Spring官方網站就是具體的介紹,下面本人對其譯成了中文.如有翻譯不當之處,敬請各位指正。  閱讀全文
          posted @ 2008-12-01 22:04 x.matthew 閱讀(1751) | 評論 (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 閱讀(7732) | 評論 (8)編輯 收藏
               摘要: 在網絡上看到了這個項目,本人對這個不太了解,但挺興趣所以也推薦給大家,希望能一起學習。
          jNetPcap是libpcap的一個Java完整封裝。jNetPcap使用與libpcap相同風格的API。libpcap是unix/linux平臺下的網絡數據包捕獲函數庫,大多數網絡監控軟件都以它為基礎。 Libpcap可以在絕大多數類unix平臺下工作。Libpcap提供了系統獨立的用戶級別網絡數據包捕獲接口,并充分考慮到應用程序的可移植性。  閱讀全文
          posted @ 2008-11-27 22:55 x.matthew 閱讀(11800) | 評論 (1)編輯 收藏
               摘要: 自JDK5.0 引入注解(Annotation)后,讓Java的開發簡化了很多,讓開發者幾乎擺脫復雜的
          配置文件的煩惱。本文將介紹Spring提供的一套相當于Commons Attribut屬性類的注解和一個策略接口 JmxAttributeSource 的實現類 AnnotationsJmxAttributeSource, 這個類允許 MBeanInfoAssembler 來讀這些注解。本文就給大家展示一下,使用Spring的JMX annotation,如何簡單快速讓POJO對象輸出到JMX.  閱讀全文
          posted @ 2008-11-26 22:20 x.matthew 閱讀(2591) | 評論 (2)編輯 收藏
               摘要: Cobertura是一個基于jcoverage的免費Java工具,它能夠顯示哪一部分代碼被你的測試所覆蓋,并可生成HTML或XML報告. 本文將介紹如何在項目中使用cobertura來測量單元測試的代碼覆蓋情況.  閱讀全文
          posted @ 2008-11-25 22:47 x.matthew 閱讀(4545) | 評論 (4)編輯 收藏
               摘要: Java Base64 這是一個用于編碼和解碼(encode/decode )base64字符串和數據流的Java開源類庫。Base64是網絡上最常見的用于傳輸8Bit字節代碼的編碼方式之一??捎脕碜鳛殡娮余]件或WebService附件的傳輸編碼.  閱讀全文
          posted @ 2008-11-25 20:23 x.matthew 閱讀(10281) | 評論 (0)編輯 收藏
               摘要: 關鍵字: Jetty, Cometd, Continuation, dojo

          前言:
          為了更容易的掌握Jetty cometd的使用方法,本筆記通過講解Jetty 6.0自帶的chat演示程序來輔助講解Jetty Cometd的實現。  閱讀全文
          posted @ 2008-11-20 20:04 x.matthew 閱讀(13935) | 評論 (10)編輯 收藏
               摘要: 在業余時間開發的一個益智小游戲《老虎過河》。游戲比較簡單,前后花了大概一天多的時間,由于對swing接觸的太少,所以在界面上花了太多的時間,而且寫的比較凌亂。  閱讀全文
          posted @ 2008-11-16 16:19 x.matthew 閱讀(4725) | 評論 (40)編輯 收藏
               摘要: 試用JBoss Envers項目有一陣子了,趁項目發布 1.1.0版,也同時把學習筆記共享給大家,希望對大家有所幫助。
          JBoss Envers目的是根據對實體的設置,提供記錄執行數據變更歷史的功能(數據變更版本)。Envers的配置非常簡單,如果需要對某個實例進行歷史數據版本記錄,只需要在實例上配置@Versioned annotation即可。針對每個實體的版本的歷史數據,Envers都會創建一個單獨的數據表進行存儲。  閱讀全文
          posted @ 2008-11-14 12:14 x.matthew 閱讀(1871) | 評論 (1)編輯 收藏
               摘要: 美國時間2008年11月11日 21點16分, SpringSource宣布并購G2One公司(G2One公司擁有Groovy和Grails兩大產品)。此次收購后, SpringSource現在將會向groovy和Grails開發團隊提供全面的技術和解決方案的支持。

          這對Groovy和Grails開發用戶,無疑是一個好消息。  閱讀全文
          posted @ 2008-11-12 16:34 x.matthew 閱讀(1689) | 評論 (5)編輯 收藏
               摘要: memcached安裝幫助手冊。  閱讀全文
          posted @ 2008-11-12 12:47 x.matthew 閱讀(5484) | 評論 (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 閱讀(31394) | 評論 (8)編輯 收藏
               摘要: 期待了許久,終于等到Spring Integration 1.0的 RC1版本。相對于Spring的其它項目,Spring Integration項目的推進速度的確是比較慢。由于本人對EIP這一塊的情有獨鐘,所以對這一塊也是一直追蹤著。RC1版本的發布,也代表著1.0 的正式也臨近發布了,請我們期待吧。
          下面是本人先前整理的學習筆記(目前只針對M6版本,RC1版有一些改動,正在整理中)  閱讀全文
          posted @ 2008-11-08 12:53 x.matthew 閱讀(1661) | 評論 (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 閱讀(476) | 評論 (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 閱讀(2201) | 評論 (0)編輯 收藏
               摘要: 本文從一個例子出發,根據TDD(測試驅動開發)要求,進行開發。只是用于演示如何使用Spring2.5提供的基于Annonation方式的IOC實現,進行TDD開發。

          首先我們來看一下這個例子的要求:
          開發一個購物車對象,可以添加商品,刪除商品,查詢已購商口,結賬功能。  閱讀全文
          posted @ 2008-11-05 19:40 x.matthew 閱讀(1908) | 評論 (2)編輯 收藏
               摘要: JSON-taglib 是 JSP 2.0 標簽庫,用于生產 JSON (JavaScript Object Notation) 數據結構。  閱讀全文
          posted @ 2008-11-03 19:30 x.matthew 閱讀(2333) | 評論 (0)編輯 收藏
               摘要: Spring2 針對遠程訪問服務,提供的一個remote包。其的的是提供一套統一的遠程服務發布功能。
          Spring2支持遠程服務功能如下:
          1. RMI服務
          2. Hessian或者Burlap通過HTTP遠程調用服務
          3. HTTP調用器暴露服務
          本文結合源碼示例,來講解如何實現這些功能發布。  閱讀全文
          posted @ 2008-11-02 19:20 x.matthew 閱讀(2513) | 評論 (1)編輯 收藏
               摘要: 雖然目前Glassfish V3離正式發布還需要一段時日,但針對V3版這么長久的發布日期,就讓人特想認識一下V3版將會給我帶來怎么樣的新特性。
          *組件化架構(OSGi Based Modular architecture)
          *可插拔式容器與動態腳本語言支持:
          *增強后的命令行模式與管理控制平臺:
          *基于角色的安全策略支持:
          *支持用于內置服務器方式部署:
          *提供讓人耳目一新的問題剖析框架:
          *REST 支持(Jersey):  閱讀全文
          posted @ 2008-10-30 19:37 x.matthew 閱讀(2805) | 評論 (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 閱讀(2664) | 評論 (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 閱讀(74768) | 評論 (73)編輯 收藏
               摘要: spy2servers已經發布有一段時間了,部分的使用手法都發布在不同的文章中:
          http://www.aygfsteel.com/xmatthew/archive/2008/04/24/194894.html
          http://www.aygfsteel.com/xmatthew/archive/2008/04/21/194349.html
          http://www.aygfsteel.com/xmatthew/archive/2008/03/24/187934.html
          http://www.aygfsteel.com/xmatthew/articles/185673.html
          現在應該是時候把它們統一整理出來了。

          本手冊分為兩部分,用戶使用手冊和開發手冊。  閱讀全文
          posted @ 2008-10-28 12:54 x.matthew 閱讀(3855) | 評論 (7)編輯 收藏
               摘要: 本人早期整理的Java工具類學習筆記  閱讀全文
          posted @ 2008-10-25 20:21 x.matthew 閱讀(4100) | 評論 (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 閱讀(5894) | 評論 (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 閱讀(3292) | 評論 (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 閱讀(3098) | 評論 (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 閱讀(659) | 評論 (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 閱讀(2119) | 評論 (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 閱讀(2857) | 評論 (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 閱讀(4801) | 評論 (4)編輯 收藏
               摘要: 今天在網上看到一個用Memcached作為Hibernate二級分布式緩存,感覺挺有興趣,就是嘗試用了,感覺還不錯,就推薦給大家看一下。  閱讀全文
          posted @ 2008-08-20 16:43 x.matthew 閱讀(14931) | 評論 (11)編輯 收藏
               摘要: 引子: VB6是一種比較早的高級語言,但可以說在它那個時代非常流行,本人就遇到不少項目用該語言進行開發,但隨著Java, .net等其它新語言的發展,VB6已經漸漸淡出了,但不少其開發的項目卻被保留了下來。目前遇到的一個困擾就是這樣的系統如何解決與新語言開發的系統的數據交互問題。本文就先拋一個話題,VB6實現基于HTTP Web調用來解決與基于B/S架構的應用程序間的調用(示例使用Java開發)。  閱讀全文
          posted @ 2008-08-19 08:50 x.matthew 閱讀(5625) | 評論 (1)編輯 收藏
          主站蜘蛛池模板: 清流县| 确山县| 安康市| 五莲县| 新余市| 三都| 石首市| 仁布县| 湘乡市| 大方县| 定襄县| 锡林郭勒盟| 焉耆| 泽州县| 黑河市| 十堰市| 乐昌市| 普宁市| 遂昌县| 秭归县| 长沙市| 新建县| 乡宁县| 额敏县| 楚雄市| 永城市| 南安市| 玛沁县| 富源县| 徐州市| 青海省| 德清县| 丰台区| 平阴县| 岫岩| 黄梅县| 个旧市| 托克托县| 长顺县| 定边县| 博湖县|