最近開始倒騰一個J2EE web應用。給它定了個很有意思的代碼名字——Potala。系統採用了基於Struts2+Spring+JPA(由Hibernate提供)的開發平台。由於是第一次真正意義上的負責一個J2EE項目,所以準備將項目中的一些學習心得和主要關注點記錄下來,可能對將來的學習也可以提供一定指導吧:)
基本架構:
最開始的想法是使用相對比較熟悉的Presentation+Facade+Service+DAO+Mdoel的模型。本來想對Hibernate進行下深入瞭解的,所以拜讀了Gavin King的Java Persistence with Hibernate。讀這本書的過程中,發現作者似乎更傾向於基於Domain Model的開發,而且原來的這套分層封裝方法似乎也沒有想象中的那麼完美。又大概翻了下Martin Fowler大牛的Patterns of Enterprise Application Architecture,覺得似乎有必要嘗試下基於Domain Model的開發。反正搞這個項目本來本來也是本著學習的精神來的,而且其他幾個組員也基本都是從零開始,咱就試試吧:) 後來又發現一本很棒的書:Chris Richardson的Pojos in Action。仔細翻閱了下,大概確定了系統的基本架構。
表現層:這層主要用Struts2的MVC來弄了,JS採用基於DOJO的開發吧,主要都丟給我們可愛的King同學去負責了。
中介層:最開始的想法是用一個標準的Facade,但Java Persistence with Hibernate第16章介紹了一種很獨特的方式——Command Pattern。雖然這種方式也有很多不完美的地方,但用它要做到對橫切面的關注(比如授權)非常方便,而且多個Command之間組合起來也比較容易。就用它吧:)
領域模型層: 套用Pojos in Action裡的方案,主要由Entity、Value Object、Repository和Service構成。其中Entity和Value Object中整合一些通用的商務邏輯,Repository負責持久化工作,Service主要關注一些無法分發給單獨的Entity或Value Object的邏輯。 在Domain Model,特別是Entity中整合商務邏輯的確有別於以前的編程模型,似乎關於這方面的爭論在JavaEye等社區上也不少。但一個比較普遍的觀點是:相對於啞對象(Dummy Object,在JavaEye上也經常有人稱為貧血模型),這種方式比較好的體現了OO準則。咱也不去瞎攪和這些爭論,同時也不求整個架構多完美,只要好用就行了:)
主要關注點:
以下這些關注點是系統設計中的一些比較主要的問題。在接下來的一些學習筆記中,我將對這些問題進行詳細描述。
領域模型對類、屬性、關係的識別和如何給領域模型添加行為;
資料庫事務的隔離等級和系統的並發控制;
商務邏輯的封裝,另外還包括每個操作一個會話問題的避免;
單元測試和基於Struts2+Spring+JPA的整合測試;
效能調優,主要包括緩衝和抓取策略。