通俗易懂解析:@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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;点…