日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

阿里为什么建议给MVC三层架构多加一层Manager层?

發布時間:2025/1/21 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里为什么建议给MVC三层架构多加一层Manager层? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MVC三層架構

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

MVC三層架構

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

三層架構示意圖

每層的作用如下:

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

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

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

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

MVC架構弊端

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

  • Service層代碼臃腫

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

  • dao層參雜業務邏輯

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

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

    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 頁面要保留之前的邏輯,也就是不需要創建用戶。

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

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

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

    @Transactional(rollbackFor?=?Throwable.class) public?Result<String>?upOrDown(Long?departmentId,?Long?swapId)?{//?驗證?1DepartmentEntity?departmentEntity?=?departmentDao.selectById(departmentId);if?(departmentEntity?==?null)?{return?Result.error("部門xxx不存在");}//?驗證?2DepartmentEntity?swapEntity?=?departmentDao.selectById(swapId);if?(swapEntity?==?null)?{return?Result.error("部門xxx不存在");}//?驗證?3Long?count?=?employeeDao.countByDepartmentId(departmentId);if?(count?!=?null?&&?count?>?0)?{return?Result.error("員工不存在");}//?操作數據庫?4Long?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.javapublic?Result<String>?upOrDown(Long?departmentId,?Long?swapId)?{//?驗證?1DepartmentEntity?departmentEntity?=?departmentDao.selectById(departmentId);if?(departmentEntity?==?null)?{return?Result.error("部門xxx不存在");}//?驗證?2DepartmentEntity?swapEntity?=?departmentDao.selectById(swapId);if?(swapEntity?==?null)?{return?Result.error("部門xxx不存在");}//?驗證?3Long?count?=?employeeDao.countByDepartmentId(departmentId);if?(count?!=?null?&&?count?>?0)?{return?Result.error("員工不存在");}//?操作數據庫?4departmentManager.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层?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 操碰视频 | 中国一级片黄色一级片黄 | 精品人妻码一区二区三区红楼视频 | 国产精品久久一区 | 亚洲AV无码精品自拍 | 欧美交换 | 黑人与亚洲人色ⅹvideos | 亚洲第一淫片 | 国产精品99久久久久久久 | youjizz.com在线观看 | 久久一本精品 | 情侣自拍av | 国产精品国产三级国产专区52 | 欧美啪啪一区 | 色呦呦网站入口 | 91丨九色丨丰满人妖 | 精品福利影院 | 久久在线免费观看 | 欧美一区三区三区高中清蜜桃 | 伊人久久免费视频 | 成人国产在线视频 | 91极品国产 | 国产原创在线观看 | 91精品国自产在线观看 | 美国一级黄色大片 | 亚洲性生活大片 | 国产主播啪啪 | 国产精品一区二区三区四 | 一级黄色免费观看 | aaaaa级少妇高潮大片免费看 | 一级啪啪片| 视频一区免费 | 亚洲国产精品一区二区久久hs | 国产成人精品综合在线观看 | 熟妇大屁股一区二区三区视频 | 神马午夜伦理影院 | 香蕉视频亚洲一级 | 人人看av| 久久国产精品一区 | 人妻 丝袜美腿 中文字幕 | 最近免费中文字幕大全免费版视频 | 日韩中文在线视频 | 18禁免费观看网站 | 国产精品乱码一区二区三区 | 毛片网站在线播放 | 蜜臀人妻四季av一区二区不卡 | 午夜免费毛片 | 久草99| 成人国产精品一区二区 | 福利在线一区 | 日韩乱码一区二区三区 | 久草综合在线观看 | 精品久久久无码中文字幕 | 一区二区三区在线视频播放 | 亚州色图欧美色图| 精品视频久久久久久 | 欧美黄色片网站 | av看片网站| 日韩av网址大全 | 男女免费观看视频 | 天天射夜夜 | 三级欧美韩日大片在线看 | 日韩成人三级 | 国产成人无码av在线播放dvd | 亚洲激情图片区 | 成人短视频在线免费观看 | www.com日本| 天天色综合1 | 亚洲综合激情 | 亚洲天堂手机在线观看 | aa一级片 | 无套内谢老熟女 | 九色蝌蚪91| 亚洲第6页 | 美国美女群体交乱 | 中文字幕在线视频免费观看 | yy色综合 | 在线观看三级网站 | 欧美成年人视频 | 日韩毛片网站 | 国产福利一区在线观看 | 91在线无精精品白丝 | 国精无码欧精品亚洲一区蜜桃 | 国产亚洲精品久久久久久久久动漫 | 欧美αv | www.com黄色| 久久精品夜色噜噜亚洲a∨ 中文字幕av网 | 99精品久久久久久久婷婷 | 美女破处视频 | 成人污 | 五月天视频网站 | 欧美国产日韩在线 | 超碰一区二区 | 夜夜嗨av一区二区三区四区 | 伊人色综合久久久 | 三上悠亚ed2k | www.com欧美| 精品国产黄色片 | 在线观看欧美国产 |