通俗易懂解析:@ComponentScan 与 @MapperScan 的异同与用法
一、基础概念
- @ComponentScan:Spring 的“通用扫描仪”
二、核心区别对比
特性 | @ComponentScan | @MapperScan |
扫描目标 | 扫描 Spring 组件(@Service、@Repository 等) | 扫描 MyBatis 的 Mapper 接口(@Mapper 注解) |
生成 Bean 的方式 | 直接注册标注类为 Bean | 生成 Mapper 接口的动态代理类 |
是否默认启用 | 是(@SpringBootApplication 包含) | 否(需显式配置) |
典型使用场景 | 业务逻辑、控制层、通用组件 | 数据访问层(MyBatis 的 Mapper 接口) |
三、使用方法详解
- @ComponentScan 的使用
// 主类(默认扫描当前包及子包)
@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 {
// ...
}
// 主类配置
@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 接口?
五、最佳实践
1.推荐用法
// 仅使用 @ComponentScan 扫描 Mapper 接口(不可行)
@SpringBootApplication
@ComponentScan("com.example.mapper")
public class Application {
// ...
}修正方法:
// 正确方式:使用 @MapperScan
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
// ...
}
六、总结
相关文章:
通俗易懂解析:@ComponentScan 与 @MapperScan 的异同与用法
在 Spring 和 MyBatis 集成开发中,ComponentScan 和 MapperScan 是两个核心注解,但它们的用途和工作机制截然不同。本文将通过通俗的语言和示例代码,带您轻松掌握它们的区别和使用方法。 一、基础概念 ComponentScan:Spring 的“通…...

深入了解 C# 异步编程库 AsyncEx
在现代应用程序开发中,异步编程已经成为提升性能和响应能力的关键,尤其在处理网络请求、I/O 操作和其他耗时任务时,异步编程可以有效避免阻塞主线程,提升程序的响应速度和并发处理能力。C# 提供了内建的异步编程支持(通…...
NodeJS全栈开发面试题讲解——P1Node.js 基础与核心机制
✅ 1.1 Node.js 的事件循环原理?如何处理异步操作? 面试官您好,我理解事件循环是 Node.js 的异步非阻塞编程核心。 Node.js 构建在 V8 引擎与 libuv 库之上。虽然 Node.js 是单线程模型,但它通过事件循环(event loop&a…...

Vulhub靶场搭建(Ubuntu)
前言:Vulhub 是一个开源的漏洞靶场平台,全称是 Vulhub: Vulnerable Web Application Environments,主要用于学习和复现各类 Web 安全漏洞。它的核心特征是通过 Docker 环境快速搭建出带有特定漏洞的靶场系统,适合渗透测试学习者、…...

C++:参数传递方法(Parameter Passing Methods)
目录 1. 值传递(Pass by Value) 2. 地址传递(Pass by Address) 3. 引用传递(Pass by Reference) 数组作为函数参数(Array as Parameter) 数组作为函数返回值 什么是函数ÿ…...

大语言模型的推理能力
2025年,各种会推理的AI模型如雨后春笋般涌现,比如ChatGPT o1/o3/o4、DeepSeek r1、Gemini 2 Flash Thinking、Claude 3.7 Sonnet (Extended Thinking)。 对于工程上一些问题比如复杂的自然语言转sql,我们可能忍受模型的得到正确答案需要更多…...
基于BERT和GPT2的实现来理解Transformer的结构和原理
Transformer 核心就是编码器和解码器,简单理解:编码器就是特征提取,解码器就是特征还原。 Transformer 完整架构 Transformer最初是一个Encoder-Decoder架构,用于机器翻译任务: 输入序列 → [Encoder] → 编码表示…...
.net consul服务注册与发现
.NET中Consul服务注册与发现的技术实践 在微服务架构中,服务的注册与发现是至关重要的环节,它能帮助各个服务之间实现高效的通信和协作。Consul作为一款功能强大的工具,为我们提供了优秀的服务注册与发现解决方案。今天,我们就来…...
WifiEspNow库函数详解
WifiEspNow库 项目地址https://github.com/yoursunny/WifiEspNow WifiEspNow 是 ESP-NOW 的 Arduino 库,ESP-NOW 是乐鑫定义的无连接 WiFi 通信协议。 有关 ESP-NOW 工作原理及其限制的更多信息,请参阅 ESP-NOW 参考。 WifiEspNow是 ESP-IDF 中 ESP-N…...
rsync使用守护进程启动服务
rsync 本身通常使用 SSH(Secure Shell)协议来进行数据传输,因此它默认使用 SSH 的端口 22。如果使用 rsync 进行通过 SSH 的数据同步,它会通过端口 22 来建立连接。 然而,如果你使用 rsync 作为一个守护进程进行文件同步(即不通过 SSH),则可以配置它使用 TCP 端口 873…...
React 核心概念与生态系统
1. React 简介 React 是由 Facebook 开发并开源的一个用于构建用户界面的 JavaScript 库。它主要用于构建单页应用(SPA),其核心理念是组件化和声明式编程,即 ui render(data)。 2. 核心特点 2.1. 声明式编程 React 使用声明式…...
使用React Native开发新闻资讯类鸿蒙应用的准备工作
以下是一篇关于使用React Native开发新闻资讯类鸿蒙应用的准备工作指南,结合鸿蒙生态特性与React Native技术栈整合要点: 一、环境搭建与工具链配置 基础依赖安装 Node.js 18:需支持ES2020语法(如可选链操…...
node-sass 报错
背景:一些老项目使用"node-sass": “^4.14.1” ,node版本要求 14.x,高版本不兼容 解决方案如下: 方案一:替换安装sass (无须降级Node版本) 卸载node-sass npm uninstall node-sass安装sass(Dart…...

Redis的安装与使用
网址:Spring Data Redis 安装包:Releases tporadowski/redis GitHub 解压后 在安装目录中打开cmd 打开服务(注意:每次客户端连接都有先打开服务!!!) 按ctrlC退出服务 客户端连接…...
Linux服务器运维10个基础命令
结合多篇权威资料,以下是运维工程师必须掌握的10个核心命令,涵盖文件管理、系统监控、网络操作等高频场景 1. "ls" 代码分析 "ls" 用于列出目录内容,通过参数组合可增强展示效果: "-l" 显示文件…...

2024年数维杯国际大学生数学建模挑战赛C题时间信号脉冲定时噪声抑制与大气时延抑制模型解题全过程论文及程序
2024年数维杯国际大学生数学建模挑战赛 C题 时间信号脉冲定时噪声抑制与大气时延抑制模型 原题再现: 脉冲星是一种快速旋转的中子星,具有连续稳定的旋转,因此被称为“宇宙灯塔”。脉冲星的空间观测在深空航天器导航和时间标准维护中发挥着至…...

C# 控制台程序获取用户输入数据验证 不合规返回重新提示输入
在 C# 控制台程序中实现输入验证并循环重试,可以通过以下方式实现高效且用户友好的交互。以下是包含多种验证场景的完整解决方案: 一、通用输入验证框架 public static T GetValidInput<T>(string prompt, Func<string, (bool IsValid, T Val…...
【大模型面试每日一题】Day 31:LoRA微调方法中低秩矩阵的秩r如何选取?
【大模型面试每日一题】Day 31:LoRA微调方法中低秩矩阵的秩r如何选取? 📌 题目重现 🌟🌟 面试官:LoRA微调方法中低秩矩阵的秩r如何选取?: #mermaid-svg-g5hxSxV8epzWyP98 {font-family:"…...
使用source ~/.bashrc修改环境变量之后,关闭服务器,在重启,环境变量还有吗?
环境变量在服务器重启后的留存性分析 1. 环境变量的存储机制 临时环境变量: 通过命令直接设置的环境变量(如 export MY_VARvalue)仅存在于当前 shell 会话中,服务器重启后会丢失。永久环境变量: 写入 配置文件&#…...
SQL 窗口函数深度解析:ROW_NUMBER 实战指南
SQL 窗口函数深度解析:ROW_NUMBER 实战指南 一、窗口函数核心概念 窗口函数(Window Function)是SQL中用于在结果集的"窗口"(即特定行集合)上执行计算的高级功能。与聚合函数不同,窗口函数不会将多行合并为单行,而是为每行返回一个计算值。 关键特性:窗口函数通…...
React从基础入门到高级实战:React 生态与工具 - React 国际化(i18n)
React 国际化(i18n) 引言 随着全球化的加速,开发支持多语言的应用已成为现代Web开发的重要需求。无论是面向国际市场的电商平台,还是提供多语言服务的SaaS应用,国际化(i18n)功能都是提升用户体…...
leetcode93.复原IP地址:回溯算法中段控制与前导零处理的深度解析
一、题目深度解析与IP地址规则 题目描述 给定一个只包含数字的字符串s,返回所有可能的有效IP地址组合。有效IP地址需满足以下条件: 由4个0-255的整数组成,用.分隔每个整数不能以0开头(除非该整数本身是0)例如输入s&…...

TDengine 运维——巡检工具(安装前检查)
简介 本文档旨在介绍 TDengine 安装部署前后配套的巡检工具。 相关工具的功能简介: 工具名称功能简介安装前检查部署前对 TDengine 安装部署的依赖要素进行安装前检查安装前预配置部署前对 TDengine 安装部署的依赖要素进行安装前预配置安装部署指定环境安装部署…...
MySQL主从复制深度解析:原理、架构与实战部署指南
一、主从复制核心原理 复制流程解析 MySQL主从复制本质是通过二进制日志(binlog)实现数据同步的异步复制机制: 写操作记录:主库执行写操作时,将变更记录到binlog 日志传输:主库的binlog dump线程将日志发送给从库 中继存储&am…...
[SC]SystemC dont_initialize的应用场景详解(二)
SystemC dont_initialize的应用场景详解(二) 摘要:下面给出一个稍复杂一点的 SystemC 示例,包含三个模块(Producer/Filter/Consumer)和一个 Testbench(Top)模块,演示了在不同的进程类型中如何使用 dont_initialize() 来抑制 time 0 的自动调用。 一、源代码 …...

【Linux】权限chmod命令+Linux终端常用快捷键
目录 linux中权限表示形式 解析标识符 权限的数字序号 添加权限命令chmod 使用数字表示法设置权限 使用符号表示法设置权限 linux终端常用快捷键 🔥个人主页 🔥 😈所属专栏😈 在 Linux 系统里,权限管理是保障系…...

Java八股文智能体——Agent提示词(Prompt)
这个智能体能够为正在学习Java八股文的同学提供切实帮助:不仅可以帮你优化答案表述,还能直接解答八股文相关问题——它会以面试者的视角,给出贴合求职场景的专业回答。 将以下内容发送给任何一个LLM,他会按照你提示词的内容&…...

Go语言的context
Golang context 实现原理 本篇文章是基于小徐先生的文章的修改和个人注解,要查看原文可以点击上述的链接查看 目前我这篇文章的go语言版本是1.24.1 context上下文 context被当作第一个参数(官方建议),并且不断的传递下去&…...
快速掌握 GO 之 RabbitMQ 结合 gin+gorm 案例
更多个人笔记见: (注意点击“继续”,而不是“发现新项目”) github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习,学习过程中还会不断补充&…...
JVM——SubstrateVM:AOT编译框架
引入 在现代软件开发领域,应用程序的启动性能和内存开销一直是影响用户体验的关键因素。对于 Java 应用程序而言,传统的即时编译(JIT)模式虽然能够在运行时对热点代码进行优化,提高程序的执行效率,但却无法…...