1. 程式人生 > >框架系列之 2 技術選型

框架系列之 2 技術選型

IOC Container: Spring, Guice

我們需要IOC Container的依賴注入作為膠水,把其他工具包粘在一起。還需要它的AOP,進行事務配置,許可權管理。

這麼多人都在使用Spring,實際使用中可以獲得巨大的便利,如果選擇了其他平臺就要面臨在關鍵時刻自己造輪子的窘境。使用Spring的實際經驗更長,方便與其他元件整合。

Guice是由Google出品的,又使用了JDK5中的註解功能,問題是以後是否能得到很好的支援。

MVC: struts2, struts, JSF, RESTful Framework, SpringMVC

struts2比struts好用,在瞭解了OGNL的用法後,還是比較方便的。

struts畢竟還是老掉牙了。

JSF好複雜,沒有IDE的支援基本沒法用,看不清方向。

RESTfull Framework感覺太草率,有前途嗎。

springmvc現在預設不包含在spring包中了,它的功能太簡陋,有些新功能華而不實。

ORM: Hibernate, JPA, iBatis, JDBC

作為ORM方案,使用hibernate3對JPA的支援,使用annotation簡化配置。

Hibernate用起來比較熟,支援多資料庫,簡化了資料庫的操作,目前把所有調優的希望都放在二級快取上了。

JPA對於規範不太瞭解。

iBatis據稱是對JDBC的最簡封裝,但是與hibernate有太多的區別。

JDBC根本沒進行封裝,用起來風險太高。使用封裝的框架更容易統一開發。

View: JSP-2.0, Freemarker, Velocity

嚴重偏向Freemarker,易用性,擴充套件性,自定義巨集,還可以用在不支援JSP-2.0的伺服器上,而且還可以與struts2配合。可是Freemarker並沒有合適IDE配合,而且能夠熟練使用的程式設計師也不多。

JSP-2.0功能明顯不足,限制太多,不容易擴充套件,必須和taglib配合才能對付實際中的工作,taglib又太難寫。

Velocity功能不如Freemarker。

Security: Spring Security, jsecurity, struts menu

Spring Security作為acegi的升級版本,更易用了,與spring整合在一起,控制權限。

jsecurity作為apache孵化器裡的專案,有人對它進行了強烈推薦。

是否還考慮基於struts menu寫一套自定義的選單?

Ajax Widgets: ExtJS, Dojo, YUI, JQuery-UI

ExtJS輕便,好用,漂亮,功能強大。只是協議有問題。

Dojo笨重,難看,都不知道怎麼用。

YUI是ExtJS的原型,但是封裝沒有ExtJS好。

JQuery-UI還很青澀。

如果不使用上述這類統一元件庫,還可以選擇jsCalendar這個日期選擇元件,FckEditor和Tiny_mce都是富文字編輯器。據說專業人士喜歡用FckEditor,喜歡漂亮的都喜歡用Tiny_mce。JavaScriptTemplate可以批量生成HTML。和DWR結合實現上傳進度條等功能。

JS Function Lib: Prototypejs, JQuery, Mootools

Prototypejs最老。對應的擴充套件主要有Script.Aculo.us。

JQuery有強力的查詢能力。對應的擴充套件容易找到。

Mootools被fin強烈推薦,說OO封裝做得很好,但感覺擴充套件元件不豐富。

JSON: DWR, json-lib

使用dwr和 commmons-fileupload製作上傳檔案的進度條。

考慮使用dwr-2的伺服器推,製作線上聊天。

與伺服器之間互動採用json格式傳遞資料,目前採用的json-lib在處理迴圈引用的時候需要特別設定,否則在處理hibernate雙向關聯的時候100%出錯。
2.2. 擴充套件架構

在基礎架構上進行的擴充套件,實現特定功能的工具:

WebService: CXF, XFire, Axis-2

Axis-2總感覺很笨重,而且不容易和Spring結合。

XFire已經停止開發,後來與Celtix合併為apache中的新專案CXF。

CXF是由Objectweb Celtix和Codehaus XFire合併成立的。與Axis1~2比較,更易於整合到Spring中。而且據說支援JAX-WS。不過不知道JAX-WS是幹啥的。

工作流: Jbpm-3, Jbpm-4, Osworkflow

Jbpm-3是開源中比較火的框架了。但是spring-module-jbpm31封裝的有問題,單元測試會報異常。

Jbpm-4太新,還是alpha版,而且改動太大了。

Osworkflow,號稱最靈活的工作流引擎,據說所有實現都要自己寫程式碼。

兩者都支援Hibernate。

規則引擎: drools

據說是很輕量級的,擁有平民語法的規則引擎。

Search Engine: Hibernate-search, Compass, Lucence

Compass同另外一個Hibernate-search都是基於Lucence,對資料庫的全文搜尋引擎。

Compass開發的時間更長一些。Hibernate-search出現的時間還比較短,會用的人少,不知道前途如何。如果兩者都不符合,還要考慮自己直接操作Lucence。

之前使用過Compass,在單元測試的時候會出現記憶體溢位的問題。

報表: JasperReport, BIRT, 自定義

JasperReport負責文字報表,JFreeChat圖形報表。

雖然沒使用過JasperReport,但已經聽到過太多其他人對它的怨言了。

BIRT沒有想像中那樣好用,依賴那些eclipse中的包,顯得太大了。

因為東西方習慣差異,自定義屬於自己的一套報表應該可以解決國內很多問題。首選答案竟然是手寫PDF和JFreeChat結合生成圖表。

JMS: ActiveMQ, Jencks, Lingo

ActiveMQ是很多人推薦使用的JMS框架。

Jencks是一個JCA平臺,可以提供J2EE裡的資源容器。

Lingo據說可以把JMS封裝成POJO。

定時排程: Quartz, java.util.Timer

據說Quartz是唯一免費的解決方式。這個元件放到web.xml裡,可能造成記憶體洩露。robbin認為這種定時任務不應該和專案繫結在一起,而是應該建立一個單獨的任務伺服器。

如果是簡單功能,也可以用JDK自帶的Timer。

Cluster Cache: Open Terracotta

被許多公司使用,據說是很強大的分佈叢集策略。

JMX: Spring封裝,MX4j

Java管理擴充套件,給人的感覺像是RMI一類的遠端呼叫。

OSGI: equinox, felix

有點兒反感equinox的笨重,而且equinox是否能和eclipse分離呢?能否獨立使用呢?能否能嵌入自己的專案呢?

felix是apache的專案,而且有maven外掛,但是看了原始碼之後,感覺太不成熟了。

動態語言: bsh, groovy, jruby, jython, rhino

bsh最簡單,而且都是java語法,功能也不多。

rhino只是解析js,也沒什麼特別功能。

groovy被期許了很大的希望,受到多方支援,有為數不少的元件,值得考慮一下。

jruby和jython的話,語法和java相差太大了,基本等於再學一門語言。
2.3. 開發環境

JDK: 5.0, 1.4, 6.0

5.0的那些特性還是很好用的,而且可以使用Retrotranslator把5.0編譯的class轉換成可以在1.4下執行的class。

推薦使用JRockit-27.2,據說可以解決sun jdk的perm gen記憶體不足問題。

6.0有點兒新了,怕出問題。

Servlet Container: Tomcat-5.5, Weblogic-9/10, Jboss, Geromino, Tomcat-6.0, Glassfish, Jetty, Resin

一般人還是用Tomcat-5.5,據說Tomcat-6.0支援OSGI了而且執行方式跟之前都不同了。

Jetty還是用在整合測試中。

之後的迭代裡,應該相容Weblogic, Jboss, Geromino, Glassfish。

資料庫: Hsqldb, Mysql, H2database, Derby, Oracle, SQLServer

採用hsqldb作為嵌入式資料庫,可與工程繫結釋出,使用者下載體驗版後不需要額外安裝資料庫,減少了配置出錯的機會。

考慮H2database和Derby,似乎H2功能更強力,Derby出身名門但是不支援commit是個問題。

Mysql是必須要支援的,因為是免費中使用特別廣的。

SQLServer也是國內很多地方使用的中型資料庫。

Oracle有很多人迷信,的確也是非常常用的大型資料庫。

Hibernate本身支援多資料庫,包括Mysql, SQLServer, Oracle等,未來替換成企業資料庫也不是問題。
2.4. 測試工具

單元測試: JUnit-3, JUnit-4, TestNG

JUnit-3。經典單元測試工具,應用很廣,基本所有工具都支援。

JUnit-4有點兒新,新功能不太清楚。

TestNG據說很厲害,但不太熟悉。

js的單元測試工具 jsunit不知如何應用。

Mock: EasyMock, JMock, Spring-test

EasyMock是老牌了,不需要繼承特定的超類。

JMock需要繼承特定超類,屬於新框架。

Spring-test裡提供了很多對付servlet裡介面的測試類。它還提供了許多常用的測試基類,可以快取xml配置並支援事務。

測試覆蓋率: Cobertura, Clover

Cobertura發展至今,介面和功能已經接近Clover了,開源並且沒有古怪的協議約束,Maven2上的配置也比Clover更簡便。

Web整合測試: Selenium

Selenium是一款被眾口稱讚的整合測試工具,使用Firefox的外掛錄製測試,然後可以翻譯成多種平臺語言進行自動化測試。

同類產品還有httpunit和jwebunit。DBUnit可以幫助維護資料庫中測試資料的完整,但是無法處理表間雙向外來鍵的情況。

可以使用Maven2外掛進行測試,但是問題是一直沒有釋出1.0,一直只能使用1.0-SNAPSHOT。

WebService測試: SOAPUI

據說是唯一的WebService測試工具。

壓力測試: JMeter

JMeter聽過但是沒用過。
2.5. 專案管理

UML: Enterprise Architecture, Rose 2003, Visio, StarUML

EA不是免費的。

Rose是名門。

Visio是畫圖挺方便。

StarUML是免費開源方案。

專案部署工具: Maven2, Ant

Ant更靈活,但是對於大規模專案,自己寫build.xml再配置所有的外掛和各種流程太麻煩了。而且要藉助ivy才好管理依賴。

Maven2擁有規範的目錄結構和流程體系,擁有更易用的外掛,還可以統一管理jar依賴,它支援多種外掛,進行自動打包,測試,程式碼分析,生成報表。。問題是從外網下載依賴的時候受網速影響太大,一旦遇到外網缺失的依賴更是無可奈何,必須搭建內部repo。Maven2的一個問題,在於不知道如何把這麼巨大的一個xml檔案拆分成多個可以複用的模組。所以也只好採用這種parent的繼承關係對所有的依賴和外掛進行管理。

持續整合: CruiseControl, Hudson

cc是老牌勁旅,但是介面也太難看了。

Hudson是日本人寫的,介面漂亮,所有配置都可以直接通過介面配置。

程式碼規範: Jalopy, checkstyle

Jalopy用來美化程式碼,sf.net上的開源專案已經好多年沒有更新了,最新的jalopy已經變成了收費的商業專案。不過我們使用幾年前的免費專案就足夠了。

把Checkstyle的規範與Jalopy的美化規範調節一致,就可以放心編寫程式碼了。

程式碼檢測: PMD, Findbugs, JavaNCSS, Taglist, Jdepend

PMD, CPD幫助我們檢測無用的程式碼和重複的程式碼。

Findbugs檢測程式碼中的缺陷。

JavaNCSS計算有效程式碼行數。

Taglist統計程式碼中的特定標記。

Jdepend用於統計包之間的依賴性。

版本控制,缺陷跟蹤和WIKI: SVN, JIRA, Confluence

Subversion作為版本控制工具,JIRA作為缺陷管理,Confluence提供資源庫平臺。

資料庫版本控制: DBDeploy

DBDeploy讓資料庫指令碼也可以實現版本控制。咱們基於dbdeploy擴充套件的dbside,可以提供db:migrate, db:rollback, db:view等功能。

使用Hibernate-tools從資料庫反向生成領域模型。

Web伺服器控制: Cargo

據說可以統一控制各種Web伺服器,比如Tomcat, Jboss, Weblogic
2.6. 雜項

JDK-5.0

公共Utils工具類。

日誌。

快取。

JavaMail。

UTF-8與國際化。

異常處理。