MVC Framwork: SpringMVC3.0 Restful的風格終于回歸了MVC框架的簡單本質,對比之下Struts2概念太復雜更新又太懶了。
Template:JSP2.0且盡量使用JSP EL而不是taglib,萬一要寫taglib也用純JSP來編寫,一向是SpringSide的推薦,Freemarker們始終有點小眾, 而Thymeleaf與美工配合度非常高,可惜也是太少用戶了。
Layout Decoration: Tiles的配置都太復雜了,SiteMesh2好些,但Sitemesh3爛尾了。
JavaScript Library: 隨大流用了JQuery。其實Dojo的面向對象語法更優美,但用戶數和插件社區差了點。
CSS Framework: 最熱火的Twitter Bootstrap,提供了簡便的布局能力和基本的頁面美化。
JavaScript/CSS Compressor: 還是隨便選的YUI Compressor。
Validation: JQuery Validation Plugin這種客戶端校驗的客戶體驗更好,而spring MVC集成hibernateValiator的服務端校驗則可以避免惡意用戶跳過頁面直接發送請求,校驗規則也更多,需要混合使用。
2. WebService
SOAP WebService: JAX-WS2.0的注解 + Apache CXF 無疑是最成熟的,一說起Axis1/2我都要打冷顫。
Restful Service: JAX-RS 1.0 + Jersey/CXF,夠標準。但直接使用Spring MVC能使架構更簡單。 如果追求極致的性能標,直接寫Servlet也沒啥。
Restful Client: 剛出來的JAX-RS 2.0標準,實際是用Jersey的client api做藍本的, 而直接使用Spring的RestTemplate可以減少第三方包的引入。
為了隔絕變化影響,隱藏細節,對外暴露的DTO和應用內部的領域對象是不同的類型,用Dozer進行復制。
請求參數的校驗,JSR303 Bean Validator的實現Hibernate Validator沒太多的競爭對手。
3. Database
數據庫設計基本原則: 見DataBase的相關章節
ORM Framework: 快速開發的應用里,領域對象肯定是用JPA標注的。至于API用Hibernate還是JPA,因為那個極簡便的,DAO只要寫接口就好了的Spring-Data-JPA,所以選了JPA。 當然,JPA的實現還是用Hibernate。
追求高性能的應用,如各種Web服務,當然就是MyBatis了。如果項目再簡單點,Spring JDBC其實也不錯。
傳統數據庫: 無非Oracle與MySQL的選擇,如果你恨MySQL依然是Oracle家的東西,可以考慮越來越多人用的,語法和Oracle很像的Postgresql。
NOSQL數據庫: 國內用的比較多的還是Redis和MongoDB。Redis更像一個數據結構服務器,暴露各種數據結構的專有API。而MongoDB將數據存成BSON格式,也提供類似SQL的查詢語句,更像一個schema-less的數據庫。
數據庫連接池: Apache DBCP本來一統江湖,現在被人批評又慢又復雜,所以有了Tomcat JDBC,另外溫少的Druid也是一個選擇。
Cache: 在JVM里的緩存,最老牌最多人用的依然是Ehcache,一些更強大的DataGrid方案如HazelCast,JBoss的Infinispan反而沒什么人用。另外最簡單的JVM內緩存是Guava的Cache。
而中央式的緩存,Memcached已經成為了事實標準。而且當主創撒手不管后,社區現在反而有著穩定的更新。 Client方面,比較穩健選擇的還是Spymemcached。
3. Services
Security Framework: 選擇Apache Shiro是因為SpringSecurity的代碼復雜度已經超過了它的實際需要,擴展困難痛苦。另一個原因是SpringSecurity的基本API居然只支持基于角色的判斷,e.g. hasRole("Administrator"),而Shiro同時還支持我們其實更常用的基于Permission的判斷,e.g. hasPermission("User:Edit")。
JMS: ActiveMQ是最多人選用的應用服務器無關的JMS實現,JBoss的HornetQ同樣只是JBoss的用戶在使用。Spring自帶的JMS封裝很好用。但還有更高級的如支持跨平臺的AMQP協議的RabbmitMQ。
Schedule: 對于固定時間間隔的任務,JDK自帶的Executor已足夠好。Cron式定時執行,Spring的Scheduler也能滿足。而且Spring的提供的純XML配置也讓Scheduler變得很簡單,Quartz更大的優勢體現在保證集群中有且僅有一臺服務器執行任務。另外,SpringSide還演示了基于Redis做了一個適合海量的只需單次觸發的任務。
JMX: Jolokia能將JMX中的MBean以Restful+JSON的方式暴露出來,使JMX這個古老的,在平臺互通中顯得有點封閉的協議重新煥發了青春。而Spring-Jmx將普通POJO注釋一下就變成MBean也非常方便。
其他Production Feature: 用Hystrix對訪問資源進行并發、延時、短路控制,防止系統雪崩。而監控方便包括自己寫的Metrics Reporter和Graphite。
4. Utilizes
General: Apache Commons Lang說是伴著我們長大的也不為過,3.0版連package名也改了,全面支持泛型。 Guava 是Google新鮮推出的優雅產品。但說它會一桶天下又不定,因為它有時候太新潮了,反而用不慣。比如StringUtils我還是喜歡用Apache的,IO也同樣是Apache Commons IO的好使。
XML: 用JDK自帶的JAXB就算了,不折騰。
JSON: GSon雖然系出名門而且接口優雅,但Jackson的功能更加豐富到匪夷所思,而且比GSon快很多。
Email: Spring自帶的Email封裝挺好用的。
Logging: Slf4j作為入口,早就替代了Apache Common Logging了,下面的實現Log4j 1.x 被批判太多同步方法太慢,Log4j作者的后作Logback就好很多了,但社區似乎不甘心log在一家QOS公司手里,又在推動log4j2.0的發展,目前還是beta版。另外選擇Logstash做日志的中央式處理。
最后,Freemarker雖然不用來做頁面Template,平時用來生成點東西也不錯的。 JodaTime這種要直接加入JDK的就不多說它了。HttpClient建議用Apache HttpClient好過JDK自帶。
5. Test
Unit Test: JUnit始終是正統,TestNG的功能如測試用例分組它也慢慢支持了。AssertJ 是目前最好的Assert語句庫。
Mock: Mockito的API比老牌的EasyMock更為優雅,而PowerMock則能配合Mockito完成static方法,函數內部new 出來的對象這些Mockito做不了的mock。
Functional Test:Selenium與WebDriver的合并后,最大改進是原來基于javascript的方案, 變成了直接調用瀏覽器的核心API,性能好了。
Performance/Stability Test: [Jmeter]作為測試工具是最成熟的,Gatling還需要時間成熟。
6. Development Environment
JDK6這樣沒什么兼容性問題又成熟得一塌糊涂的版本建議大家都升級吧。JDK7也不錯,有G1垃圾收集器和Try-Catch新語法的語法糖。
用Jetty7是因為它的嵌入式版本做得好,集成測試不用部署直接就開跑了。開發時一般也不用Eclipse插件,直接自己在代碼里啟動了,省下打包拷貝War文件的時間。Tomcat現在也有嵌入式版本了,而Jetty最新版要JDK7。
用H2 Database,既是嵌入式的,又可以持久化到文件用Web Console查看,性能還是嵌入式中最好的。
用Maven,在項目構建腳本不復雜的時候的首選,否則就只能ant+ivy了,或者像hibernate和spring一樣,用gradle.
另外,用Log4jdbc在開發時查看實際執行的SQL。
最后,用Jenkins做持續集成, Sonar做代碼質量檢查,是大部分好項目的共同愛好。