通俗易懂解析:@ComponentScan 與 @MapperScan 的異同與用法

在 Spring 和 MyBatis 集成開發中,@ComponentScan 和 @MapperScan 是兩個核心注解,但它們的用途和工作機制截然不同。本文將通過通俗的語言和示例代碼,帶您輕松掌握它們的區別和使用方法。

一、基礎概念

  1. @ComponentScan:Spring 的“通用掃描儀”
作用:掃描并注冊 Spring 容器中的組件(如 @Service、@Repository、@Controller 等注解標注的類)。
特點:
默認掃描主類所在包及其子包。
無需額外配置即可自動裝配通用組件。
無法直接處理 MyBatis 的 Mapper 接口(需要配合 @MapperScan)。
2. @MapperScan:MyBatis 的“專用掃描儀”
作用:掃描并注冊 MyBatis 的 Mapper 接口(即數據庫操作接口),將其轉換為 Spring Bean。
特點:
需要顯式配置掃描路徑。
通過動態代理生成 Mapper 接口的實現類。
與 @Mapper 注解配合使用(可選)。

二、核心區別對比

特性
@ComponentScan
@MapperScan
掃描目標
掃描 Spring 組件(@Service、@Repository 等)
掃描 MyBatis 的 Mapper 接口(@Mapper 注解)
生成 Bean 的方式
直接注冊標注類為 Bean
生成 Mapper 接口的動態代理類
是否默認啟用
是(@SpringBootApplication 包含)
否(需顯式配置)
典型使用場景
業務邏輯、控制層、通用組件
數據訪問層(MyBatis 的 Mapper 接口)

三、使用方法詳解

  1. @ComponentScan 的使用
場景:管理通用 Spring 組件(如 Service、Repository)
示例代碼:
// 主類(默認掃描當前包及子包)
@SpringBootApplication
public class Application {
public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
// Service 層
@Service
public class UserService {public String getUser() {return "User from Service";}
}
// Repository 層
@Repository
public class UserRepository {public String getUser() {return "User from Repository";}
}

自定義掃描路徑:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.service", "com.example.repository"})
public class Application {
// ...
}
2. @MapperScan 的使用
場景:管理 MyBatis 的 Mapper 接口
示例代碼:
// 主類配置
@SpringBootApplication
@MapperScan("com.example.mapper") // 指定 Mapper 接口掃描路徑
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}// Mapper 接口
@Mapper // 可選,如果 @MapperScan 已指定路徑,則無需在此添加
public interface UserMapper {@Select("SELECT * FROM users")List<User> findAll();
}替代方案:在配置類中使用:@Configuration
@MapperScan("com.example.mapper") // 配置類中同樣有效
public class MyBatisConfig {// 可配置 MyBatis 相關 Bean(如攔截器)
}

四、常見問題與誤區

1.為什么不能僅用 @ComponentScan 加載 Mapper 接口?

原因:@ComponentScan 只負責注冊 Bean,但 MyBatis 的 Mapper 接口需要動態代理生成實現類。如果僅依賴 @ComponentScan,調用時會拋出異常。
解決方法:必須使用 @MapperScan 或在每個 Mapper 接口上添加 @Mapper 注解。
2. @MapperScan 和 @ComponentScan 能同時使用嗎?
答案:可以,但需注意掃描路徑沖突

五、最佳實踐

1.推薦用法

Mapper 接口:始終使用 @MapperScan 配置掃描路徑,避免在每個接口上添加 @Mapper。
通用組件:依賴 @SpringBootApplication 內置的 @ComponentScan,或顯式擴展掃描路徑。
2. 錯誤示例與修正
錯誤示例:
// 僅使用 @ComponentScan 掃描 Mapper 接口(不可行)
@SpringBootApplication
@ComponentScan("com.example.mapper")
public class Application {
// ...
}修正方法:
// 正確方式:使用 @MapperScan
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
// ...
}

六、總結

1、@ComponentScan關鍵點:管理通用 Spring 組件(Service、Repository 等) 默認啟用,無需額外配置
2、@MapperScan關鍵點:管理 MyBatis 的 Mapper 接口 必須顯式配置掃描路徑,支持動態代理生成
通過合理使用 @ComponentScan 和 @MapperScan,您可以高效管理 Spring 和 MyBatis 的組件,簡化代碼結構并提高開發效率。記住:Mapper 接口需要專用掃描儀(@MapperScan),而通用組件交給通用掃描儀(@ComponentScan)!

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

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

相關文章

39. 自動化異步測試開發之編寫異步業務函數、測試函數和測試類(函數寫法)

39. 自動化異步測試開發之編寫異步業務函數、測試函數和測試類&#xff08;函數寫法&#xff09; 一、異步業務函數解析 1.1 頁面導航函數 async def get(async_driver, url: str http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx):await…

Qt 無邊框窗口實現拖動與窗口控制(最小化/最大化/關閉)

在 Qt 中&#xff0c;使用 Qt::FramelessWindowHint 可以創建無邊框窗口&#xff0c;但這樣會導致窗口無法拖動&#xff0c;并且系統默認的標題欄按鈕&#xff08;最小化、最大化、關閉&#xff09;也會消失。本文將介紹如何實現無邊框窗口的鼠標拖動功能&#xff0c;并添加自定…

Linux中的System V通信標準-共享內存、消息隊列以及信號量

在Linux系統中&#xff0c;System V IPC&#xff08;Inter-Process Communication&#xff09;提供了一系列進程間通信的機制&#xff0c;包括共享內存、消息隊列和信號量。這些機制在系統中發揮了重要作用&#xff0c;幫助進程之間進行數據交換和同步。本文將詳細介紹這些機制…

postman工具使用

基本功能操作 常用斷言 定義&#xff1a;postman 斷言借助 JavaScript - js 語言編寫代碼&#xff0c;自動判斷預期結果與實際結果是否一致。&#xff08; 注意斷言 代碼寫在 Tests 的標簽中&#xff09; 斷言響應狀態碼 斷言響應體是否包含某個字符串&#xff08;Response bo…

VBA數據庫解決方案二十:Select表達式From區域Where條件Order by

《VBA數據庫解決方案》教程&#xff08;版權10090845&#xff09;是我推出的第二套教程&#xff0c;目前已經是第二版修訂了。這套教程定位于中級&#xff0c;是學完字典后的另一個專題講解。數據庫是數據處理的利器&#xff0c;教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法…

算法-集合的使用

1、set常用操作 set<int> q; //以int型為例 默認按鍵值升序 set<int,greater<int>> p; //降序排列 int x; q.insert(x); //將x插入q中 q.erase(x); //刪除q中的x元素,返回0或1,0表示set中不存在x q.clear(); //清空q q.empty(); //判斷q是否為空&a…

C++文件和流基礎

C文件和流基礎 1. C文件和流基礎1.1 文件和流的概念1.2 標準庫支持1.3 常用文件流類ifstream 類ofstream 類fstream 類 2.1 打開文件使用構造函數打開文件使用 open() 成員函數打開文件打開文件的模式標志 2.2 關閉文件使用 close() 成員函數關閉文件關閉文件的重要性 3.1 寫入…

Maven---配置本地倉庫

目錄 5. 5.1在Maven路徑下新建文件夾用于本地倉庫存儲 5.2 復制本地倉庫路徑 5.3 找到配置文件路徑&#xff0c;使用VSCode方式打開 5.4 新增一行代碼 5.5 復制本地倉庫路徑&#xff0c;設置存儲路徑 5.1在Maven路徑下新建文件夾用于本地倉庫存儲 5.2 復制本地倉庫路徑 5…

Vue3 + Element Plus + TypeScript 中 el-cascader 實現模擬用戶點擊功能

模擬點擊&#xff0c;調用 el-cascader 的公開方法 togglePopperVisible 來展開下拉框 MaterialOut.vue <script setup lang"ts" name"MaterialOut"> ...... import { ElMessage, type ElCascader } from "element-plus";// 級聯組件實例…

新能源汽車與油車銷量

中國油車與新能源車銷量對比&#xff08;2022-2025年&#xff09; ?1. 市場份額演化&#xff08;2022-2025年&#xff09;? ?年份? ?新能源車銷量 &#xff08;滲透率&#xff09;? ?燃油車銷量 &#xff08;滲透率&#xff09;? ?關鍵事件? ?2022? 688.7萬輛…

C++ list代碼練習、set基礎概念、set對象創建、set大小操作

對應力扣&#xff0c;回文鏈表&#xff0c;代碼見下 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, …

前端面試寶典---前端水印

明水印 1. 背景圖 通過css的background-image加載背景圖 2. canvasbackground水印 前端水印實現思路與示例代碼 一、核心實現思路 Canvas動態生成水印 通過Canvas繪制文本或圖案&#xff0c;將生成的圖像轉為Base64格式&#xff0c;作為背景圖重復平鋪到目標元素上。例如&…

惡意軟件清理工具,讓Mac電腦安全更簡單

?你的Mac最近是不是開始表演"電子迷惑行為"&#xff1f;瀏覽器主頁突然變成澳門賭場&#xff0c;風扇轉得比直升機螺旋槳還猛......恭喜你&#xff01;可能中獎獲得"惡意軟件大禮包"&#xff01;別慌&#xff0c;今天就教你用惡意軟件清理工具化身數字特工…

Spring Boot 3.X 下Redis緩存的嘗試(二):自動注解實現自動化緩存操作

前言 上文我們做了在Spring Boot下對Redis的基本操作&#xff0c;如果頻繁對Redis進行操作而寫對應的方法顯示使用注釋更會更高效&#xff1b; 比如&#xff1a; 依之前操作對一個業務進行定入緩存需要把數據拉取到后再定入&#xff1b; 而今天我們可以通過注釋的方式不需要額外…

Deepseek應用技巧-Dify安裝和踩坑指南

前言&#xff1a;Dify的名號是非常大的&#xff0c;作為私有化AI部署中必不可少的一個組件&#xff0c;他的功能和COZE十分相似&#xff0c;可以進行工作流和智能體的搭建&#xff0c;有非常強大的功能&#xff0c;那本節就將來揭開Dify的神秘的面紗&#xff0c;首先看一下Dify…

ubuntu24.04安裝教程(圖文詳解)

Ubuntu 24.04 LTS&#xff0c;代號 Noble Numbat&#xff0c;于 2024 年 4 月 25 日發布&#xff0c;現在可以從 Ubuntu 官方網站及其鏡像下載。此版本將在 2029 年 4 月之前接收為期五年的官方安全和維護更新。 關于 Ubuntu 24.04 LTS 的一些關鍵點&#xff1a; 發布日期&am…

數據綁定頁面的完整的原理、邏輯關系、實現路徑是什么?頁面、表格、字段、屬性、值、按鈕、事件、模型、腳本、服務編排、連接器等之間的關系又是什么?

目錄 一、核心概念:什么是數據綁定頁面? 二、涉及的組件及其邏輯關系 頁面(Page): 表格(Table): 字段(Field): 屬性(Property): 值(Value): 按鈕(Button): 事件(Event): 模型(Model): 腳本(Script): 服務(Service): 服務編排(Se…

【 SpringCloud | 微服務 網關技術 】

單體架構時我們只需要完成一次用戶登錄、身份校驗&#xff0c;就可以在所有業務中獲取到用戶信息。而微服務拆分后&#xff0c;每個微服務都獨立部署&#xff0c;這就存在一些問題&#xff1a; 每個微服務都需要編寫登錄校驗、用戶信息獲取的功能嗎&#xff1f; 當微服務之間調…

python,Dataframe基于所有包含某個關鍵字的列等于某個值過濾

在 Python 中&#xff0c;使用 Pandas 的 DataFrame 丟棄符合特定條件的行&#xff0c;條件為所有包含某個關鍵字的列中&#xff0c;等于某個值&#xff08;即所有包含某個關鍵字的列中等于某個值的行&#xff09;&#xff0c;可用以下方法實現&#xff1a; import pandas as …

50天50個小項目 (Vue3 + Tailwindcss V4) ? | Sound Board(音響控制面板)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— SoundBoard 組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ &#x1f3af; 組件目標 實現一個響應式按鈕面板&#xff0c;點…