Spring的業務層,持久層,控制層的關系

在 Spring 框架中,控制層(Controller)業務層(Service)?和?持久層(Repository/Mapper)?是分層架構的核心組成部分,職責分離明確,通過依賴注入(DI)協作。

1. 各層職責

(1) 控制層(Controller)

  • 作用:處理?HTTP 請求和響應,是前后端交互的入口。

  • 職責

    • 接收請求參數(如?@RequestParam@RequestBody)。

    • 調用?業務層?處理邏輯。

    • 返回 JSON 數據或視圖(如?@ResponseBody)。

  • 核心注解

    • @Controller(返回視圖)或?@RestController(純 API,返回 JSON)。

(2) 業務層(Service)

  • 作用:處理?核心業務邏輯(如訂單計算、權限校驗)。

  • 職責

    • 組合多個持久層操作(如事務管理)。

    • 處理業務規則(如數據校驗、流程控制)。

    • 調用?持久層?操作數據庫。

  • 核心注解

    • @Service(標識業務組件)。

    • @Transactional(管理事務)。

(3) 持久層(Repository/Mapper)

  • 作用:直接與?數據庫交互,執行 CRUD 操作。

  • 職責

    • 定義數據庫操作方法(如 SQL 或 ORM 映射)。

    • 屏蔽數據庫細節(如 MySQL 或 MongoDB 差異)。

  • 核心注解

    • JPA:@Repository(接口繼承?JpaRepository)。

    • MyBatis:@Mapper(接口 + XML/SQL 映射)。

2. 各層協作關系

(1) 調用流程

HTTP請求 → Controller → Service → Repository → 數據庫↑返回響應        ↑業務邏輯         ↑SQL執行
  1. Controller?接收請求參數,校驗格式。

  2. Service?處理業務邏輯(如訂單總價計算),調用 Repository 讀寫數據。

  3. Repository?執行 SQL 或通過 ORM 操作數據庫,返回結果給 Service。

  4. Service?處理完成后,返回數據給 Controller。

  5. Controller?封裝響應(如 JSON),返回給前端。

(2) 依賴關系

  • 單向依賴

    Controller → Service → Repository
    • 上層依賴下層,下層不感知上層(如 Repository 不依賴 Service)。

    • 通過?@Autowired?實現依賴注入。

3. 分層優勢

優勢說明
職責分離各層專注單一職責(如 Controller 處理請求,Service 處理業務)。
代碼復用多個 Controller 可共用同一個 Service(如訂單和支付模塊共用用戶服務)。
易于維護修改數據庫邏輯只需調整 Repository,不影響 Service 和 Controller。
事務管理事務注解(@Transactional)通常放在 Service 層,確保業務操作原子性。
測試友好可單獨測試 Service 邏輯,Mock 數據庫操作(如使用 Mockito)。

4. 實際開發中的常見問題

(1) 能不能跳過 Service,直接 Controller 調用 Repository?

  • 不推薦!會導致:

    • 業務邏輯散落在 Controller 中,難以復用。

    • 事務管理困難(如多個 Repository 操作無法統一回滾)。

(2) Service 層為什么需要接口?

  • 接口的作用

    • 實現類可替換(如切換緩存策略)。

    • 便于 AOP 代理(如事務管理、日志切面)。

      public interface UserService {  // 接口User getUserById(Long id);
      }@Service
      public class UserServiceImpl implements UserService {  // 實現類// 具體邏輯
      }

? ? (3) 實體類(Entity)放在哪一層?

  • 通常獨立為領域模型層

    com.example.project
    ├── controller
    ├── service
    ├── repository
    └── entity  // 實體類(User、Order)
    • 所有層共享實體類,但?避免將實體直接暴露給前端(建議用 DTO 轉換)。

5. 總結

  • Controller:處理 HTTP 交互,參數校驗,調用 Service。

  • Service:核心業務邏輯,事務管理,調用 Repository。

  • Repository:數據庫操作,屏蔽 SQL 細節。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81829.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81829.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css實現不確定內容的高度過渡

實現效果&#xff1a;鼠標懸浮按鈕&#xff0c;高度過渡出現如圖所示文本框 代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

計算機視覺與深度學習 | matlab實現ARIMA-WOA-CNN-LSTM時間序列預測(完整源碼和數據)

以下是一個基于MATLAB的ARIMA-WOA-CNN-LSTM時間序列預測框架。由于完整代碼較長,此處提供核心模塊和實現思路,完整源碼和數據可通過文末方式獲取。 1. 數據準備(示例數據) 使用MATLAB內置的航空乘客數據集: % 加載數據 data = readtable(airline-passengers.csv); data …

在 Excel 中使用東方仙盟軟件————仙盟創夢IDE

安裝插件 用仙盟創夢編寫插件代碼 源碼 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 東方仙盟.仙盟創夢IDE_招標系統 {public static class 仙盟創夢_招標專…

Sql刷題日志(day9)

一、筆試 1、limit offset&#xff1a;分頁查詢 SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET start_row; --跳過前 start_row 行&#xff0c;返回接下來的 number_of_rows 行。 2、lag、lead&#xff1a;查詢前后行數據 --lag函數用于訪問當…

C++面試3——const關鍵字的核心概念、典型場景和易錯陷阱

const關鍵字的核心概念、典型場景和易錯陷阱 一、const本質&#xff1a;類型系統的守護者 1. 與#define的本質差異 維度#defineconst編譯階段預處理替換編譯器類型檢查作用域無作用域&#xff08;全局污染&#xff09;遵循塊作用域調試可見性符號消失保留符號信息類型安全無類…

16-看門狗和RTC

一、獨立看門狗 1、獨立看門狗概述 在由單片機構成的微型計算機系統中&#xff0c;由于單片機的工作常常會受到來自外界電磁場的干擾&#xff0c;造成程序的跑飛&#xff08;不按照正常程序進行運行&#xff0c;如程序重啟&#xff0c;但是如果我們填加看門狗的技術&#xff0…

w~自動駕駛~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法來啦&#xff01; 在自動駕駛系統當中&#xff0c;感知任務是整個自駕系統中至關重要的組成部分。感知任務的主要目標是使自動駕駛車輛能夠理解和感知周圍的環境元素&…

怎么打包發布到npm?——從零到一的詳細指南

怎么打包發布到npm&#xff1f;——從零到一的詳細指南 目錄 怎么打包發布到npm&#xff1f;——從零到一的詳細指南一、準備工作1. 注冊 npm 賬號2. 安裝 Node.js 和 npm 二、初始化項目三、編寫你的代碼四、配置 package.json五、打包你的項目六、登錄 npm七、發布到 npm八、…

【C++ - 仿mudou庫one thread one loop式高并發服務器實現】

文章目錄 項目介紹項目模塊和服務器主要設計模式項目主要流程前置知識1.bind函數2.定時器任務TimerTask和時間輪思想TimerWheel3.正則表達式4.通用型容器Any類 服務器設計模式1&#xff09;單Reactor單線程模式2&#xff09;單Reactor多線程模式3&#xff09;多Reactor多線程模…

RISC-V 開發板 MUSE Pi Pro USB 測試(3.0 U盤,2.0 UVC攝像頭)

視頻講解&#xff1a; RISC-V 開發板 MUSE Pi Pro USB 測試&#xff08;3.0 U盤&#xff0c;2.0 UVC攝像頭&#xff09; 總共開發板有4個USB的A口&#xff0c;1個USB的TypeC口&#xff0c;我們插上兩個USB3.0的U盤和一個USB2.0的UVC攝像頭來進行測試 lsusb -tv 可以看到有3個US…

docker學習與使用(概念、鏡像、容器、數據卷、dockerfile等)

文章目錄 前言引入docker 簡介docker的應用場景docker的虛擬化技術VS虛擬機docker的優點docker架構Docker倉庫Docker鏡像linux操作系統的大致組成部分 Docker容器 docker安裝與啟動校驗版本移除舊的版本安裝依賴工具設置軟件源安裝docker驗證 配置鏡像加速器docker服務相關命令…

記錄一次服務器卡頓

一、服務器卡頓現象 服務用了一段時間后&#xff0c;突然很卡&#xff0c;發現在服務器上新建excel也很卡&#xff0c;發現服務器中病毒了&#xff0c;然后重新安裝了操作系統。重新安裝服務環境時&#xff0c;發現同時安裝pdf、tomcat時都很慢&#xff0c;只能一個安裝好了&am…

基于 Reactor 的 Java 高性能異步編程:響應式流與背壓詳解

本文將圍繞 Reactor 框架&#xff0c;深入剖析響應式流的核心機制&#xff0c;重點講解背壓&#xff08;Backpressure&#xff09;的實現原理與實際應用。通過理論結合實踐&#xff0c;希望幫助你真正掌握 Java 世界的響應式異步編程。 一、響應式編程與 Reactor 簡介 1.1 什么…

知識蒸餾實戰:用PyTorch和預訓練模型提升小模型性能

在深度學習的浪潮中&#xff0c;我們常常追求更大、更深、更復雜的模型以達到最先進的性能。然而&#xff0c;這些“龐然大物”般的模型往往伴隨著高昂的計算成本和緩慢的推理速度&#xff0c;使得它們難以部署在資源受限的環境中&#xff0c;如移動設備或邊緣計算平臺。知識蒸…

python:mysql全局大覽(保姆級教程)

本文目錄&#xff1a; 一、關于數據庫**二、sql語言分類**三、數據庫增刪改查操作**四、庫中表增刪改查操作**五、表中記錄插入**六、表約束**七、單表查詢**八、多表查詢**&#xff08;一&#xff09;外鍵約束**&#xff08;二&#xff09;連結查詢**1.交叉連接&#xff08;笛…

Android framework 問題記錄

一、休眠喚醒&#xff0c;很快熄屏 1.1 問題描述 機器休眠喚醒后&#xff0c;沒有按照約定的熄屏timeout 進行熄屏&#xff0c;很快就熄屏&#xff08;約2s~3s左右&#xff09; 1.2 原因分析&#xff1a; 抓取相關log&#xff0c;打印休眠背光 相關調用棧 //具體打印調用棧…

怎么利用JS根據坐標判斷構成單個多邊形是否合法

怎么利用JS根據坐標判斷構成單個多邊形是否合法 引言 在GIS(地理信息系統)、游戲開發、計算機圖形學等領域,判斷一組坐標點能否構成合法的簡單多邊形(Simple Polygon)是一個常見需求。合法多邊形需要滿足幾何學上的基本規則,本文將詳細介紹如何使用JavaScript實現這一判…

sqlite的拼接字段的方法(sqlite沒有convert函數)

我在sqlserver 操作方式&#xff1a; /// <summary>///獲取當前門店工資列表/// </summary>/// <param name"wheres">其他條件</param>/// <param name"ThisMendian">當前門店</param>/// <param name"IsNotU…

構建高效移動端網頁調試流程:以 WebDebugX 為核心的工具、技巧與實戰經驗

現代前端開發早已不僅僅局限于桌面瀏覽器。隨著 Hybrid 應用、小程序、移動 Web 的廣泛應用&#xff0c;開發者日常面臨的一個關鍵挑戰是&#xff1a;如何在移動設備上快速定位并解決問題&#xff1f; 這不再是“打開 DevTools 查查 Console”的問題&#xff0c;而是一個關于設…

新興技術與安全挑戰

7.1 云原生安全(K8s安全、Serverless防護) 核心風險與攻擊面 Kubernetes配置錯誤: 風險:默認開放Dashboard未授權訪問(如kubectl proxy未鑒權)。防御:啟用RBAC,限制ServiceAccount權限。Serverless函數注入: 漏洞代碼(AWS Lambda):def lambda_handler(event, cont…