轉(zhuǎn)自:http://www.cnblogs.com/zx3707/p/5708486.html
1. DAO層:DAO層主要是做數(shù)據(jù)持久層的工作,負(fù)責(zé)與數(shù)據(jù)庫進(jìn)行聯(lián)絡(luò)的一些任務(wù)都封裝在此郭膛,DAO層的設(shè)計(jì)首先是設(shè)計(jì)DAO的接口晨抡,然后在Spring的配置文件中定義此接口的實(shí)現(xiàn)類,然后就可在模塊中調(diào)用此接口來進(jìn)行數(shù)據(jù)業(yè)務(wù)的處理则剃,而不用關(guān)心此接口的具體實(shí)現(xiàn)類是哪個類耘柱,顯得結(jié)構(gòu)非常清晰,DAO層的數(shù)據(jù)源配置棍现,以及有關(guān)數(shù)據(jù)庫連接的參數(shù)都在Spring的配置文件中進(jìn)行配置调煎。
2. Service層:Service層主要負(fù)責(zé)業(yè)務(wù)模塊的邏輯應(yīng)用設(shè)計(jì)。同樣是首先設(shè)計(jì)接口己肮,再設(shè)計(jì)其實(shí)現(xiàn)的類士袄,接著再Spring的配置文件中配置其實(shí)現(xiàn)的關(guān)聯(lián)。這樣我們就可以在應(yīng)用中調(diào)用Service接口來進(jìn)行業(yè)務(wù)處理谎僻。Service層的業(yè)務(wù)實(shí)現(xiàn)娄柳,具體要調(diào)用到已定義的DAO層的接口,封裝Service層的業(yè)務(wù)邏輯有利于通用的業(yè)務(wù)邏輯的獨(dú)立性和重復(fù)利用性艘绍,程序顯得非常簡潔赤拒。
3. Controller層:Controller層負(fù)責(zé)具體的業(yè)務(wù)模塊流程的控制,在此層里面要調(diào)用Serice層的接口來控制業(yè)務(wù)流程,控制的配置也同樣是在Spring的配置文件里面進(jìn)行挎挖,針對具體的業(yè)務(wù)流程这敬,會有不同的控制器,我們具體的設(shè)計(jì)過程中可以將流程進(jìn)行抽象歸納蕉朵,設(shè)計(jì)出可以重復(fù)利用的子單元流程模塊崔涂,這樣不僅使程序結(jié)構(gòu)變得清晰,也大大減少了代碼量始衅。
4. View層?此層與控制層結(jié)合比較緊密冷蚂,需要二者結(jié)合起來協(xié)同工發(fā)。View層主要負(fù)責(zé)前臺jsp頁面的表示觅闽,
DAO層帝雇,Service層這兩個層次都可以單獨(dú)開發(fā),互相的耦合度很低蛉拙,完全可以獨(dú)立進(jìn)行尸闸,這樣的一種模式在開發(fā)大項(xiàng)目的過程中尤其有優(yōu)勢,Controller孕锄,View層因?yàn)轳詈隙缺容^高吮廉,因而要結(jié)合在一起開發(fā),但是也可以看作一個整體獨(dú)立于前兩個層進(jìn)行開發(fā)畸肆。這樣宦芦,在層與層之前我們只需要知道接口的定義,調(diào)用接口即可完成所需要的邏輯單元應(yīng)用轴脐,一切顯得非常清晰簡單调卑。
DAO設(shè)計(jì)的總體規(guī)劃需要和設(shè)計(jì)的表,和實(shí)現(xiàn)類之間一一對應(yīng)大咱。
DAO層所定義的接口里的方法都大同小異恬涧,這是由我們在DAO層對數(shù)據(jù)庫訪問的操作來決定的,對數(shù)據(jù)庫的操作碴巾,我們基本要用到的就是新增溯捆,更新,刪除厦瓢,查詢等方法提揍。因而DAO層里面基本上都應(yīng)該要涵蓋這些方法對應(yīng)的操作。除此之外煮仇,可以定義一些自定義的特殊的對數(shù)據(jù)庫訪問的方法劳跃。
Service邏輯層設(shè)計(jì)
Service層是建立在DAO層之上的,建立了DAO層后才可以建立Service層浙垫,而Service層又是在Controller層之下的售碳,因而Service層應(yīng)該既調(diào)用DAO層的接口,又要提供接口給Controller層的類來進(jìn)行調(diào)用,它剛好處于一個中間層的位置贸人。每個模型都有一個Service接口,每個接口分別封裝各自的業(yè)務(wù)處理方法佃声。
在DAO層定義的一些方法艺智,在Service層并沒有使用,那為什么還要在DAO層進(jìn)行定義呢圾亏?這是由我們定義的需求邏輯所決定的十拣。DAO層的操作?經(jīng)過抽象后基本上都是通用的,因而我們在定義DAO層的時候可以將相關(guān)的方法定義完畢志鹃,這樣的好處是在對Service進(jìn)行擴(kuò)展的時候不需要再對DAO層進(jìn)行修改夭问,提高了程序的可擴(kuò)展性。
在DAO層定義的一些方法曹铃,在Service層并沒有使用缰趋,那為什么還要在DAO層進(jìn)行定義呢?這是由我們定義的需求邏輯所決定的陕见。DAO層的操作 經(jīng)過抽象后基本上都是通用的秘血,因而我們在定義DAO層的時候可以將相關(guān)的方法定義完畢,這樣的好處是在對Service進(jìn)行擴(kuò)展的時候不需要再對DAO層進(jìn)行修改评甜,提高了程序的可擴(kuò)展性灰粮。
DAO完成連接數(shù)據(jù)庫修改刪除添加等的實(shí)現(xiàn)細(xì)節(jié),例如sql語句是怎么寫的忍坷,怎么把對象放入數(shù)據(jù)庫的粘舟。service層是面向功能的,一個個功能模塊比如說銀行登記并完成一次存款佩研,UI要把請求給service層柑肴,然后service曾將這一個case分解成許多步驟調(diào)用底層的實(shí)現(xiàn)完成這次存款,dao就是下面那層韧骗。
dao就是把數(shù)據(jù)存起來嘉抒,之所以service的方法會有雷同只不過是因?yàn)閟ervice得需求不是很復(fù)雜不用再service里面完成太多包裝或者處理過程可以直接調(diào)用dao的方法就完成的請求處理例如就要save一個對象,而這個對象是封裝好的袍暴,dao里面有個方法專門save封裝好的對象于是service的方法就僅僅調(diào)用一下就o了些侍,函數(shù)簽名自然很像了service不能直接接觸持久層,而dao是持久層或者直接訪問持久層有的時候只是為了分層清楚,為了將來scale?up的時候方便我們才把service和dao分開辑莫,其實(shí)沒必要分開的菩鲜。
---------------------------------------------------------------
根據(jù)不同項(xiàng)目的復(fù)雜度來確定是否需要分層,如果是小項(xiàng)目的話,2層應(yīng)該就夠了,分層是為了很好的解耦,和程序的可觀性,還有就是很好的項(xiàng)目分工,如果遇到某個客戶需要修改某個查詢結(jié)果集合,你需要修改的首先是dao的SQL,接著是service的相應(yīng)調(diào)用方法來為VIEW服務(wù),??如果是分層清楚的話,只需要在DAO中加一個方法,在SERVICE中改變起調(diào)用的方法接口,需要改動的不大,
-----------------------------------------------------------------
在用ssh進(jìn)行開發(fā)中,一般情況下都是分為三層:web層spring層dao層耗式,基本的流程是首先定義一個dao接口,然后去實(shí)現(xiàn)這個接口,在定義同類型的service接口(service接口與dao接口是完全一樣)刊咳,再實(shí)現(xiàn)service接口彪见,(這是是用dao接口去注入),然后web層在去調(diào)用service層娱挨。
DAO層的職責(zé)是純粹的數(shù)據(jù)操作余指,如果是hibernate,那就只需要類似getHibernateTemplate().save,?update,?delete,?findyBy*這類的方法而service層是負(fù)責(zé)寫業(yè)務(wù)邏輯的跷坝,純粹的業(yè)務(wù)邏輯酵镜,其中的數(shù)據(jù)操作是通過注入的DAO實(shí)現(xiàn)的,但是業(yè)務(wù)是在這層柴钻。?如果你的service層與dao層代碼嚴(yán)重重復(fù)淮韭,這說明你的業(yè)務(wù)比較簡單。復(fù)雜業(yè)務(wù)這個結(jié)構(gòu)的優(yōu)勢就很明顯了贴届。service層的作用是對dao取得的數(shù)據(jù)做操作更貼近于業(yè)務(wù)的實(shí)現(xiàn)?dao只是數(shù)據(jù)的增刪改查靠粪,對小型的應(yīng)用來說,SSH?確實(shí)提高了開發(fā)成本和開發(fā)周期粱腻,但是卻有利于擴(kuò)展和維護(hù)庇配。
利用spring?的ioc?解偶使業(yè)務(wù)邏輯與持久層松偶合。
-----------------------------------------------------------------
分層并不一定是絕對的绍些,具體的還是要根據(jù)項(xiàng)目實(shí)際情況來定捞慌,不是么?如果是理想狀態(tài)的話柬批,恐怕在你的service層上面還要再多加一層的啸澡。但是你覺得有必要嗎?
實(shí)際上氮帐,對于小項(xiàng)目來說嗅虏,直接通過dao來進(jìn)行操作也不是不可以,搞得太復(fù)雜上沐,也沒有必要皮服。這是我的個人感覺。就好像po和dto一樣参咙,有的人直接就將po傳到web層龄广,有的還要加一個轉(zhuǎn)換,由dto進(jìn)行數(shù)據(jù)傳遞蕴侧。顯然后者實(shí)現(xiàn)更理想择同,但是你不覺得這樣很麻煩嗎。?微軟的净宵。net號稱有11層(還是多少層來著敲才,反正層很多)裹纳,但是實(shí)際能分出多少層,還是根據(jù)開發(fā)者自己情況來定了紧武。要注意代碼是死的剃氧,人是活的,不要死套框架阻星,否則自己很可能也會陷入開發(fā)誤區(qū)她我。