業務層
Service層:引用對應的Dao資料庫操作,在這裡可以寫自己需要的程式碼(例如簡單的判斷)。
service層是呼叫各種dao的業務作業,例如你有一個業務是添加,然後修改。那你分別呼叫dao的新增和修改操作,包含裡面的一些資料轉換,邏輯判斷都放到service層,dao只是單純的增刪改查。而且事務一般會放到service層。
其中Service層和DAO層由於可能都會對資料庫進行操作,其具體區別為:
dao和service對應
一般情況下,Hibernate DAO只會操作一個POJO對象,因此一個DAO對應一個POJO對象。 Service層是為了處理包含多個POJO物件(即對多個資料表的資料操作)時,進行事務管理(聲明式事務管理)。 Service層(其介面的實作類別)被注入多個DAO對象,以完成其資料操作。
Service之有無
這一點我的看法未必正確,我的腦海現在有兩種建構業務層的模式:
模式1是Service DAO,即DAO中只做CRUD及類似的簡單操作(稱之為功能點,不包含業務邏輯),Service中透過呼叫一個或多個DAO中的功能點來組合成為業務邏輯.Service的數量應該由功能模組來決定。
在這種模型中業務邏輯是放在Service中的,事務的邊界也應該在Service中控制. 當然,直接在Service中控制事務會引入非業務邏輯的代碼,幸好Spring的AOP可以解決這個問題,這也是引入Spring的原因之一.
如果說到缺點,就在於對某些物件的操作就是簡單的CRUD,Service層顯得累贅.
模式2是Service BO, 而BO = DAO 業務方法, 在原先DAO的基礎上添加業務方法,形成BO對象。需要注意的是BO中的業務方法往往是針對一個實體對象的,如果需要跨越多個實體對象,則方法應該放在Service中。
舉例來說,
一個簡單的銀行帳戶管理系統,建立帳戶這個BO對象,裡面可以有修改密碼,取錢等業務方法(不難看出,這些方法都只對單一帳戶物件進行操作)。現在需要新增一個轉帳方法,就應該放在Service中。
這裡Service和BO的關係是什麼樣的呢?再舉一例:
以國家行政機關為例:糧食局負責收糧,賣種子等,建設部負責審批土地買賣,建設公路等,這都是行政部分份內的事兒。突然某地發了水災,救災時需要糧食局開倉放糧,建設部建造臨時房屋,如何協調兩個部門?就需要成立專門的救災委員會,由救災委員會出面對兩個部分的資源進行調撥。這裡兩個部分就是BO,而救災委員會就是Service。不知我的意思是否表達準確了,呵呵。模式1的在劃分Service和DAO時界線清晰,但會帶來一些不必要的程式碼。模式2的劃分相對複雜,然而可以提高編碼效率。
當然小規模的應用中,沒有Service,完全是DAO或BO也是可以接受的。
Service和DAO的介面之有無
介面是一種契約,它可以有多種實作。所以介面之有無取決於具體實作是否需要多樣化。如果鐵定一種DAO或一種Service只有一種實現,那麼抽像出介面的意義不大。然而一些大型應用或許需要DAO和Service的多種實作(例如上面例子中的帳戶DAO,可能需要一種Hibernate實作、一種CMP實作和一種JDO實作),為了向上一層隱藏具體實作類,需要採用接口。
隱藏特定實作類別的建立過程,這有兩種方法:一是實用工廠方法,代價是程式碼量大(每個DAO和Service一個工廠)。二是使用Spring的IoC,實現依賴注入,不需要寫額外的程式碼,這也是引入Spring的理由之二。
以上是javaweb業務層該怎麼寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!