国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java開發MVC三層架構上再加一層Manager層原理詳解

java開發MVC三層架構上再加一層Manager層原理詳解

2022-03-03 00:42飄渺Jam Java教程

這篇文章主要為大家介紹了MVC三層架構中再加一層Manager層原理的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

MVC三層架構

我們在剛剛成為程序員的時候,就會被前輩們 “教育” 說系統的設計要遵循 MVC(Model-View-Controller)架構。它將整體的系統分成了 Model(模型),View(視圖)和 Controller(控制器)三個層次,也就是將用戶視圖和業務處理隔離開,并且通過控制器連接起來,很好地實現了表現和邏輯的解耦,是一種標準的軟件分層架構。

java開發MVC三層架構上再加一層Manager層原理詳解

MVC分層架構是架構上最簡單的一種分層方式。為了遵循這種分層架構我們在構建項目時往往會建立這樣三個目錄:controller、service 和 dao,它們分別對應了表現層、邏輯層還有數據訪問層。

java開發MVC三層架構上再加一層Manager層原理詳解

每層的作用如下:

Controller層:主要是對訪問控制進行轉發,各類基本參數校驗,或者不復用的業務簡單處理。

Service層:主要是處理業務邏輯和事務

Dao層:負責與底層數據庫MySQL,Oracle等進行數據交互

可是隨著我們的業務邏輯越來復雜,代碼寫的越來越多,這種簡單的三層架構的問題也越來越明顯。

 

MVC架構弊端

傳統的MVC分層有以下幾個很明顯的問題:

Service層代碼臃腫

Service層很容易出現大事務,事務嵌套,導致問題很多,而且極難排查

dao層參雜業務邏輯

dao層sql語句復雜,關聯查詢比較多

為了解決這個問題,我們參考《alibaba java開發手冊》,在Service層之下再獨立出一個通用業務處理層(Manager層)

java開發MVC三層架構上再加一層Manager層原理詳解

在這個分層架構中主要增加了 Manager 層,它與 Service 層的關系是:Manager 層提供原子的服務接口,Service 層負責依據業務邏輯來編排原子接口。

 

Manager層的特征

在《alibaba java開發手冊》中是這樣描述Manager層的:

Manager 層:通用業務處理層,它有如下特征:

對第三方平臺封裝的層,預處理返回結果及轉化異常信息,適配上層接口;對 Service 層通用能力的下沉,如緩存方案、中間件通用處理;與 DAO 層交互,對多個 DAO 的組合復用。

在實際開發中我們可以這樣使用Manager層

復雜業務,service提供數據給Manager層,負責業務編排,然后把事務下沉到Manager層,Manager層不允許相互調用,不會出現事務嵌套。

專注于不帶業務sql語言,也可以在manager層進行通用業務的dao層封裝。

避免復雜的join查詢,數據庫壓力比java大很多,所以要嚴格控制好sql,所以可以在manager層進行拆分,比如復雜查詢。

當然對于簡單的業務,可以不使用Manager層。

 

Manager層使用案例

這里我們舉個例子說明一下Manager層的使用場景:

假設你有一個用戶系統,他有一個獲取用戶信息的接口,它調用邏輯Service層的 getUser 方法,getUser方法又和 User DB 交互獲取數據。如下圖左邊展示部分。

這時,產品提出一個需求,在 APP 中展示用戶信息的時候,如果用戶不存在,那么要自動給用戶創建一個用戶。同時,要做一個 HTML5 的頁面,HTML5 頁面要保留之前的邏輯,也就是不需要創建用戶。

java開發MVC三層架構上再加一層Manager層原理詳解

此時按照傳統的三層架構,邏輯層的邊界就變得不清晰,表現層也承擔了一部分的業務邏輯,因為我們往往會在表現層Controller中增加業務邏輯處理,將獲取用戶和創建用戶接口編排起來。

而添加Manager層以后,Manager 層提供創建用戶和獲取用戶信息的接口,而 Service 層負責將這兩個接口組裝起來。這樣就把原先散布在表現層的業務邏輯都統一到了 Service 層,每一層的邊界就非常清晰了。

接下來我們看一段實際代碼說明一下Service層與Manager層如何進行區分?

@Transactional(rollbackFor = Throwable.class)
public Result<String> upOrDown(Long departmentId, Long swapId) {
// 驗證 1
DepartmentEntity departmentEntity = departmentDao.selectById(departmentId);
if (departmentEntity == null) {
  return Result.error("部門xxx不存在");
}
// 驗證 2
DepartmentEntity swapEntity = departmentDao.selectById(swapId);
if (swapEntity == null) {
  return Result.error("部門xxx不存在");
}
// 驗證 3
Long count = employeeDao.countByDepartmentId(departmentId);
if (count != null && count > 0) {
  return Result.error("員工不存在");
}
// 操作數據庫 4
Long departmentSort = departmentEntity.getSort();
departmentEntity.setSort(swapEntity.getSort());
departmentDao.updateById(departmentEntity);
swapEntity.setSort(departmentSort);
departmentDao.updateById(swapEntity);
return Result.OK("success");
}

上面代碼在我們在我們采用三層架構時經常會遇到,那么它有什么問題呢?

上面的代碼是典型的長事務問題(類似的還有調用第三方接口),前三步都是使用 connection 進行驗證操作,但是由于方法上有@Transactional 注解,所以這三個驗證都是使用的同一個 connection。

若對于復雜業務、復雜的驗證邏輯,會導致整個驗證過程始終占用該 connection 連接,占用時間可能會很長,直至方法結束,connection 才會交還給數據庫連接池。

對于復雜業務的不可預計的情況,長時間占用同一個 connection 連接不是好的事情,應該盡量縮短占用時間。

說明:對于@Transactional 注解,當 spring 遇到該注解時,會自動從數據庫連接池中獲取 connection,并開啟事務然后綁定到 ThreadLocal 上,如果業務并沒有進入到最終的 操作數據庫環節,那么就沒有必要獲取連接并開啟事務,應該直接將 connection 返回給數據庫連接池,供其他使用。

所以我們在加入Manager層以后可以這樣寫:

DepartmentService.java 
public Result<String> upOrDown(Long departmentId, Long swapId) {
// 驗證 1
DepartmentEntity departmentEntity = departmentDao.selectById(departmentId);
if (departmentEntity == null) {
  return Result.error("部門xxx不存在");
}
// 驗證 2
DepartmentEntity swapEntity = departmentDao.selectById(swapId);
if (swapEntity == null) {
  return Result.error("部門xxx不存在");
}
// 驗證 3
Long count = employeeDao.countByDepartmentId(departmentId);
if (count != null && count > 0) {
  return Result.error("員工不存在");
}
// 操作數據庫 4
departmentManager.upOrDown(departmentSort,swapEntity);
return Result.OK("success");
}
DepartmentManager.java

@Transactional(rollbackFor = Throwable.class)
public void upOrDown(DepartmentEntity departmentEntity ,DepartmentEntity swapEntity){
Long departmentSort = departmentEntity.getSort();
departmentEntity.setSort(swapEntity.getSort());
departmentDao.updateById(departmentEntity);
swapEntity.setSort(departmentSort);
departmentDao.updateById(swapEntity);
}

將數據在 service 層準備好,然后傳遞給 manager 層,由 manager 層添加 @Transactional事務注解進行數據庫操作。

以上就是MVC三層架構上再加一層Manager層原理詳解的詳細內容,更多關于MVC架構Manager層原理的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/jianzhang11/article/details/120884260

延伸 · 閱讀

精彩推薦
  • Java教程Java集合框架源碼分析之LinkedHashMap詳解

    Java集合框架源碼分析之LinkedHashMap詳解

    這篇文章主要介紹了Java集合框架源碼分析之LinkedHashMap詳解,內容包括了linkedhashmap的簡介和源碼剖析以及關于LinkedHashMap的源碼總結,內容豐富,需要的朋友...

    BridgeGeorge4792021-01-10
  • Java教程java 中ThreadLocal實例分析

    java 中ThreadLocal實例分析

    這篇文章主要介紹了java 中ThreadLocal實例分析的相關資料,需要的朋友可以參考下...

    jamesjxin4272020-11-17
  • Java教程SpringMVC的ModelAndView傳值方法

    SpringMVC的ModelAndView傳值方法

    今天小編就為大家分享一篇SpringMVC的ModelAndView傳值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    ODG8722021-05-24
  • Java教程String與XML互轉以及從XML取節點值并修改的方法

    String與XML互轉以及從XML取節點值并修改的方法

    今天小編就為大家分享一篇String與XML互轉以及從XML取節點值并修改的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    浪丶蕩8712021-05-18
  • Java教程spring mvc中的@ModelAttribute注解示例介紹

    spring mvc中的@ModelAttribute注解示例介紹

    在Spring mvc中,注解@ModelAttribute是一個非常常用的注解,下面這篇文章主要給大家介紹了關于spring mvc中@ModelAttribute注解的相關資料,文中通過示例代碼介紹...

    沈子平5182020-12-28
  • Java教程老生常談Java字符串進階(必看篇)

    老生常談Java字符串進階(必看篇)

    下面小編就為大家帶來一篇老生常談Java字符串進階(必看篇)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    腳本之家4542020-11-19
  • Java教程Java開發神器Lombok使用詳解

    Java開發神器Lombok使用詳解

    這篇文章主要介紹了Java開發神器Lombok使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨...

    程序新視界9582021-10-11
  • Java教程Gson解析空字符串發生異常的處理方法

    Gson解析空字符串發生異常的處理方法

    最近在一個項目中遇到一個問題,當面對一些不規范的json,我們的gson解析經常會拋出各種異常導致app崩潰,通過在網上查找資料,找到了原因,這篇文章給大...

    daisy7172020-06-30
主站蜘蛛池模板: 午夜黄色影院 | 日本综合久久 | 亚洲人成网亚洲欧洲无码 | 一区二区三区在线看 | 一区二区三区免费观看视频 | 国产精品成人3p一区二区三区 | www.久久.com | 中文字幕视频一区 | 亚洲高清精品视频 | 日韩在线观看视频一区二区三区 | 四季久久免费一区二区三区四区 | av在线资源网| 欧美国产一区二区三区 | 欧美日韩专区 | 欧美在线观看一区 | 色吧网站| 欧美一区二区在线播放 | 免费在线a| av一区二区在线观看 | 成人免费网站 | 青青草91青娱盛宴国产 | 国产精品密在线观看 | 在线观看国产视频 | 一区二区三区亚洲 | 黄色一级片免费播放 | 国产中文字幕在线观看 | 色综合视频 | 免费看黄色一级电影 | 日韩在线免费视频 | 久久久久99啪啪免费 | 懂色一区二区三区av片 | 综合五月网 | 国产综合视频在线观看 | av大全在线观看 | 九九精品视频在线 | 国内成人自拍视频 | 一区二区三区视频 | 91精品一区二区 | 香蕉久久av一区二区三区 | 91视频网址 | 一级黄色小视频 |