溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

springmvc分層領(lǐng)域模型的示例分析

發(fā)布時(shí)間:2021-08-23 12:36:32 來(lái)源:億速云 閱讀:389 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)springmvc分層領(lǐng)域模型的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

1.為什么出現(xiàn)分層領(lǐng)域模型這個(gè)東西?

(1)解決MVC架構(gòu)中各層(比如視圖層+控制層+服務(wù)層+數(shù)據(jù)訪問(wèn)層+數(shù)據(jù)庫(kù))中各層數(shù)據(jù)交互時(shí),傳遞什么數(shù)據(jù)模型更加科學(xué)和合理。
(2)更好的降低MVC架構(gòu)中各層間的耦合性,提高層內(nèi)的內(nèi)聚性,這樣更方便對(duì)軟件進(jìn)行維護(hù)
(3)一定程度上的提高信息的安全性,根據(jù)瀏覽器,可以知道視圖層和控制層傳輸?shù)臄?shù)據(jù)模型,但是很難準(zhǔn)確定位其它各層傳輸?shù)念I(lǐng)域模型中的具體字段。

2.分層領(lǐng)域模型有哪些?

①VO(ViewObject)
顯示層對(duì)象,通常是Web向模板渲染引擎層傳輸?shù)膶?duì)象(阿里Java開(kāi)發(fā)手冊(cè)分層領(lǐng)域模型),對(duì)于一個(gè)WEB頁(yè)面,用一個(gè)VO對(duì)象對(duì)應(yīng)整個(gè)界面的值。
②DTO(DataTransferObject)
數(shù)據(jù)傳輸對(duì)象,前后端分離開(kāi)發(fā)模式中,前端與controller層數(shù)據(jù)交換,在java中作為數(shù)據(jù)傳輸,應(yīng)該進(jìn)行序列化。
③BO(Business Object)
業(yè)務(wù)對(duì)象,主要作用是把業(yè)務(wù)邏輯封裝成一個(gè)對(duì)象。這個(gè)對(duì)象可以包括一個(gè)或多個(gè)其它的對(duì)象,用來(lái)處理業(yè)務(wù)邏輯。有時(shí)候做開(kāi)發(fā)時(shí),當(dāng)controller層調(diào)用Service層服務(wù)接口時(shí),把DTO領(lǐng)域模型或者其它數(shù)據(jù)模型轉(zhuǎn)換為BO模型**,作為參數(shù)傳遞給Service接口。
④DAO(Data Access Object )
數(shù)據(jù)訪問(wèn)層對(duì)象,主要用來(lái)封裝對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),它是一個(gè)面向?qū)ο蟮臄?shù)據(jù)庫(kù)接口,負(fù)責(zé)持久層的操作,為業(yè)務(wù)層提供接口,主要用來(lái)封裝對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),常見(jiàn)操作無(wú)外乎 CURD。在Mybatis中對(duì)應(yīng)的是Mapper。
⑤PO(Persistant Object)
持久對(duì)象,簡(jiǎn)單說(shuō)PO就是數(shù)據(jù)庫(kù)中的記錄,一個(gè)PO的數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)著庫(kù)中表的結(jié)構(gòu),表中的一條記錄就是一個(gè)PO對(duì)象
通常PO里面除了get,set之外沒(méi)有別的方法
對(duì)于PO來(lái)說(shuō),數(shù)量是相對(duì)固定的,一定不會(huì)超過(guò)數(shù)據(jù)庫(kù)表的數(shù)量
等同于Entity,Entity基本等于POJO(Plain Ordinary Java Object)
⑥D(zhuǎn)O
DO現(xiàn)在主要有兩個(gè)版本:
一個(gè)是阿里巴巴的開(kāi)發(fā)手冊(cè)中的定義, DO(Data Object)這個(gè)等同于上面的PO.
另一個(gè)是在DDD(Domain-Driven Design)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中
DO(Domain Object)這個(gè)等同于上面的BO

3.分層領(lǐng)域模型的簡(jiǎn)單理解

有圖有真相,別的慢扯,先上圖

springmvc分層領(lǐng)域模型的示例分析

3.1 VO和DTO的區(qū)別

(1)VO(Value Object)
這貨就是用來(lái)展示,就是界面(網(wǎng)頁(yè),客戶端,APP)展示時(shí),從后臺(tái)獲取的展示出的數(shù)據(jù)(在網(wǎng)頁(yè)中,VO主要以js里面的對(duì)象存在
(2)DTO(Data Transfer Object)
圖中,該類橫跨兩個(gè)層次,即有兩種存在形式:
①后端,DTO是以java對(duì)象的形式,前端傳遞的數(shù)據(jù)(目前主流是json),由框架(主流的springboot)轉(zhuǎn)為DTO形式
②前端:以js里面的對(duì)象(也可以簡(jiǎn)單理解成json),比如
ajax請(qǐng)求中的數(shù)據(jù)體**
(3)主要區(qū)別
字段不一樣,VO往往根據(jù)展示業(yè)務(wù)的不同,刪減一部分DTO中的字段,因此也造就了值不一樣
比如DTO數(shù)據(jù)為

{
“name”:“kun”
“age”:100
}

展示業(yè)務(wù)一需要的數(shù)據(jù)(VO):

{
“age”:100
}

3.2BO和DTO的區(qū)別

(1)BO 業(yè)務(wù)對(duì)象
BO應(yīng)該說(shuō)是一個(gè)業(yè)務(wù)對(duì)象,對(duì)應(yīng)著一類業(yè)務(wù),一類業(yè)務(wù)(BO)可能會(huì)有很多業(yè)務(wù)操作,換言之,BO會(huì)有很多針對(duì)自身數(shù)據(jù)進(jìn)行計(jì)算的方法。比如springMVC中的service層中有很多service類,每個(gè)類除了get和set方法(@Autowired自動(dòng)注入),還定義了很多調(diào)用Mapper(DAO)的方法.
(2)為什么圖中BO橫跨兩層
①現(xiàn)在很多持久層框架自身就提供了數(shù)據(jù)組合的功能。
②BO有可能是在業(yè)務(wù)層由業(yè)務(wù)來(lái)拼裝PO而成
③也有可能是在數(shù)據(jù)庫(kù)訪問(wèn)層由框架直接生成
④很多情況下為了追求查詢的效率,框架跳過(guò)PO直接生成BO的情況非常普遍,PO只是用來(lái)增刪改使用
(3)BO和DTO的主要區(qū)別和聯(lián)系
BO是對(duì)內(nèi)(比如DAO等),DTO是對(duì)外(比如前端)
BO為了進(jìn)行業(yè)務(wù)計(jì)算需要輔助數(shù)據(jù),輔助數(shù)據(jù)可能來(lái)自DTO。
③BO可以為上層提供的很多數(shù)據(jù),其中可能有DTO某些業(yè)務(wù)不需要的,因此DTO需要在BO的基礎(chǔ)上,只要自己需要的數(shù)據(jù),然后對(duì)外提供。
④在這個(gè)關(guān)系上,通常不會(huì)有數(shù)據(jù)內(nèi)容的變化,內(nèi)容變化要么在BO內(nèi)部業(yè)務(wù)計(jì)算的時(shí)候完成,要么在解釋VO的時(shí)候完成

4.總結(jié)

(1)分層領(lǐng)域模型是偏理論,實(shí)際應(yīng)用的時(shí)候,根據(jù)所使用的框架進(jìn)行切合實(shí)際的修改和省略。
(2)如果第一次接觸,建議按照教條進(jìn)行操作,以方便加深理解。
(3)不要教條主義的前提,也有熟悉和理解教條主義,才能結(jié)合實(shí)際進(jìn)行操作。

關(guān)于“springmvc分層領(lǐng)域模型的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI