1.概述
?? 技術框架選型以工業化大規模軟件開發為原則---主流的選型、適宜團隊分工的架構,同時照顧輕量級快速開發的需求,Java版的約定大于配置的風格。
2.主要庫棧
- JDK:JDK 6.0、 UTF-8.
- IOC container:Spring 3.
- ORM:Hibernate 3.3.
- Web :Struts 2.1、JSP 2.0、JQuery 1.4/Dojo Base 1.4.
- Web Service:基于Apache CXF 2.2的JAX-WS/JAXB 2.0規范, 基于Jersey的JAX-RS規范.
- Security: Spring Security 3.0.
3.層次說明
3.1 entity - 領域模型層
??? 使用Sql First的開發模式,先設計數據庫,參考DBA的性能意見而不要太片面追求OO化的表結構。
??? 然后純手工編寫entity與極少量的JPA annotation(約定大于配置), 也可以用hibernate-tools從數據庫逆向生成后再作修改。
3.2 access - 資源訪問層
??? 資源訪問層包括對數據庫、JMS、外部的WebService等的訪問。
??? 每個領域對象對應一個DAO類,繼承于通用的HibernateDao<T>,所有以該對象為查詢主體的HQL語句統一定義于DAO內并提供查詢函數.
? ? 在性能緊要而Hibernate又無法滿足要求時,可混合使用JDBCTemplate。
3.3 service - 業務邏輯層
? ? Service層有兩類對象,
??? 一類是領域對象管理類(Entity Manager), 按領域對象劃分,每個Manager類負責管理多個緊密關聯的Entity的增刪改查及其業務邏輯。
??? 一類是業務服務類(Service),按業務腳本劃分,可能會訪問到多種領域對象與Manager類。
??? 用Spring的Transcation annotation定義事務。 對于Hibernate Lazy load的關聯對象,在性能要求不高時可使用OpenSessionInView Filter,否則在Service層完成對象的初始化操作。
3.4 web - Web MVC層
??? MVC框架使用Struts 2.1 這一老牌傳統MVC框架 + Convention Plugin 實現零配置文件,每個Action實現一組頁面操作。
??? View模板用JSP2.0 , 盡量使用純html+JSP2.0 EL展示頁面。
??? Javascript與Ajax使用JQuery或Dojo Base。
??? 盡量采用CSS框架規范CSS的布局。
3.5 ws - WebService接口
??? 使用Java first的開發模式,通過JSR181 annotation標注Web Service接口,用JAXB-2.0 annotation標注Java-XML Mapping。
??? 用DTO類實現Entity與外系統的解耦,用WSResult包裹返回結果與返回碼,不使用Exception返回錯誤。
? ? 對于Restful服務,同樣采用JAX-RS annotation標注。
3.6 security - 安全控制
???? 使用Spring Security的Filter 攔截URL,使用Spirng Security的taglib 攔截頁面內容。
? ?? 采用 用戶-角色-資源 三層控制,角色-資源關系定義于XML的簡化模式。
3.7 測試
?? 單元測試盡量采用MockObject的方式屏幕所有依賴對象/數據的訪問,對于dao層與特別查詢與特別數據庫操作,采用集成測試連接實際數據庫,基于Spring的集成測試Context。
?? 功能測試使用selenium測試主要用戶故事的主流程及Javascript的效果, 使用Jetty嵌入式Web服務器與H2嵌入式數據庫,使用DBUnit預備數據,使得整個測試可以快速運行,對測試環境沒有太多的依賴。
4.常見問題
4.1 什么時候使用基于接口編程 ?
? ? ? 基于接口編程、Fascade層等等抽象封裝都是有開發和維護的代價的,是否使用歸根結底還是看在團隊人員的分工情況,在大家不得不依賴這幾項技術來解決相互的接口、契約問題時,自然就用了。
4.2 Package是先分層還是先分模塊
? ?? org.springside.模塊A.web 還是 org.springside.web.模塊A? 同上,還是看團隊人員的分工情況。如果是每人從頭到尾負責一個獨立模塊的可以先分模塊。反之,按層進行分工并鼓勵層內重用的,可以考慮先分層。