当前位置: 首页 > article >正文

Spring Boot 中 @Autowired、构造器注入、@Mapper 的本质区别(一次讲透)

一、写在前面很多刚接触 Spring Boot 的同学都会有这些疑问为什么有的地方用Autowired为什么现在又推荐“构造器注入”Mapper到底是干嘛的为什么没有实现类也能用Controller / Service / Mapper 的注入方式为什么看起来不一样这篇文章我不讲表面用法而是从本质原理讲清楚Spring 到底是如何管理对象的MyBatis 是如何“生成 Mapper”的为什么构造器注入是更优解二、核心一句话先记住Spring 的核心不是注解而是容器 Bean 依赖关系三、Spring 容器到底在干嘛你可以把 Spring 容器理解成一个“对象仓库”。Spring 容器 - 存放各种对象Bean - 管理对象生命周期 - 负责依赖注入四、Bean 是怎么来的1️⃣ Controller / ServiceRestController Service Spring 扫描这些注解 → 自动创建对象 → 放入容器2️⃣ Mapper重点Mapper public interface UserMapper { } 注意这是接口没有实现类那它怎么变成 Bean 的MyBatis 的作用MyBatis 会为 Mapper 接口生成一个“代理对象” → 再把这个代理对象注册到 Spring 容器 所以本质是UserMapper ≠ 普通类 UserMapper MyBatis 生成的代理对象五、三层结构关系必须搞懂Controller → Service → Mapper → 数据库举个例子RestController public class UserController { private final UserService userService; } Service public class UserServiceImpl { private final UserMapper userMapper; } 本质Controller 依赖 Service Service 依赖 Mapper Mapper 操作数据库六、依赖注入的两种方式❌ 方式1字段注入AutowiredAutowired private UserService userService; 执行流程1. 先 new 对象 2. 再通过反射注入依赖 问题对象创建时不完整 ❌依赖不明显 ❌不利于测试 ❌✅ 方式2构造器注入推荐private final UserService userService; public UserController(UserService userService) { this.userService userService; } 执行流程new UserController(userService) 优点对象一创建就是完整的 ✔依赖清晰 ✔支持 final ✔更安全 ✔七、为什么推荐构造器注入1️⃣ 保证对象完整性字段注入如果你在构造方法里打印依赖public UserServiceImpl() { System.out.println(userMapper); //可能还是 null ❌ }因为这时候对象刚创建依赖还没注入。构造器注入public UserServiceImpl(UserMapper userMapper) { System.out.println(userMapper); // 有值 ✔ }说明对象从出生开始就是完整的。2️⃣ 依赖更清晰public UserServiceImpl(UserMapper userMapper) 一眼就知道依赖谁3️⃣ 支持 final更安全private final UserMapper userMapper; 依赖不会被修改 依赖初始化后就不能随便被改掉代码更稳。八、Mapper 到底干了什么Mapper public interface UserMapper { } 它的作用是告诉 MyBatis 这是一个 Mapper 接口 → 为它生成代理对象 → 注册到 Spring 容器补充企业级用法MapperScan重点在实际企业项目中通常不会在每个 Mapper 上写Mapper而是使用统一扫描。1️⃣ 企业推荐写法 ⭐SpringBootApplication MapperScan(com.xxx.project.infrastructure.persistence.mapper) public class ProjectApplication { }然后public interface UserMapper { } 注意Mapper 接口上 不用写 Mapper2️⃣ 本质区别非常关键Mapper作用在“单个接口”→ 标记这个接口需要生成代理MapperScan作用在“包”→ 扫描整个包→ 批量生成 Mapper 代理对象→ 注册到 Spring 容器3️⃣ 为什么企业用 MapperScan项目一大可能有- UserMapper- OrderMapper- PayMapper- InventoryMapper...几十甚至上百个 Mapper 如果每个都写Mapper问题冗余 ❌容易漏 ❌不统一 ❌4️⃣ 企业标准结论必须记住小项目✔ Mapper企业项目✔ MapperScan主流标准5️⃣ 再升一级面试加分点MapperScan 本质通过 ImportBeanDefinitionRegistrar动态注册 Mapper Bean个人推荐MapperScan Mapper 双保险更严谨MapperScan( basePackages org.example.arkbackend.mapper, annotationClass Mapper.class )同时接口上Mapper public interface UserMapper { }这时候它的含义是1、扫描指定包2、但不是见接口就处理 而是只处理带 Mapper 的接口这就是“双保险”。好处在于包范围有约束注解标记也有约束更不容易误扫在规范要求高的项目里更严谨方案对比方案是否推荐说明全部写Mapper✅简单直观适合学习和小项目只用MapperScan✅企业常用简洁高效MapperScanMapper更严谨避免误扫九、一个完整流程重点理解1. Spring 启动2. 扫描 Service / Controller → 创建 Bean3. MyBatis 扫描 Mapper → 生成代理对象4. 所有对象放入 Spring 容器5. 构造器注入依赖6. Controller 调用 Service7. Service 调用 Mapper8. Mapper 执行 SQL十、最终推荐写法企业标准ControllerRestController RequiredArgsConstructor RequestMapping(/user) public class UserController { private final UserService userService; }ServiceService RequiredArgsConstructor Slf4j public class UserServiceImpl implements UserService { private final UserMapper userMapper; }MapperMapper public interface UserMapper { } 统一规则所有依赖注入一律使用 构造器注入 final Lombok十一、常见误区总结❌ 误区1Mapper 不需要注入 错Mapper 也是 Bean一样通过依赖注入使用❌ 误区2Autowired 是必须的 错构造器注入不需要 AutowiredSpring 自动识别❌ 误区3Controller 可以随便写 错Controller / Service / Mapper 应该统一规范十二、总结一句话Controller、Service、Mapper 本质一样都是 Spring 容器里的 Bean区别只是“谁创建它”。十三、最后如果你刚学到这里建议你立刻做一件事 写一个完整链路Controller → Service → Mapper → 查询数据库 → 返回结果这是从“理解框架”到“能干活”的关键一步。

相关文章:

Spring Boot 中 @Autowired、构造器注入、@Mapper 的本质区别(一次讲透)

一、写在前面很多刚接触 Spring Boot 的同学,都会有这些疑问:为什么有的地方用 Autowired?为什么现在又推荐“构造器注入”?Mapper 到底是干嘛的?为什么没有实现类也能用?Controller / Service / Mapper 的…...

AISQL生成不是噱头,是生产力革命:37个真实生产环境SQL生成失败案例全复盘

第一章:AISQL生成不是噱头,是生产力革命:37个真实生产环境SQL生成失败案例全复盘 2026奇点智能技术大会(https://ml-summit.org) 在金融、电商与SaaS平台的37个线上生产系统中,我们对主流AISQL工具(含LangChainLlama…...

Stable Diffusion Anything V5保姆级教学:快速搭建AI绘画平台

Stable Diffusion Anything V5保姆级教学:快速搭建AI绘画平台 1. 概述与准备工作 Stable Diffusion Anything V5是一款强大的AI绘画模型,能够根据文字描述生成高质量的图像作品。本教程将带你从零开始搭建属于自己的AI绘画平台,无需复杂的配…...

MGeo模型效果展示:支持‘北京市海淀区五道口地铁站A口’等交通节点地址解析

MGeo模型效果展示:支持‘北京市海淀区五道口地铁站A口’等交通节点地址解析 你有没有遇到过这样的场景?在网上看到一个活动地址是“海淀区五道口地铁站A口往东100米”,想在地图上搜索,却发现导航软件根本识别不了这么具体的描述。…...

Java 高并发场景下 Redis 分布式锁(UUID+Lua)最佳实践

一、核心原理:Redis 分布式锁的设计基石1.1 分布式锁的核心要求一款可靠的分布式锁需满足以下 4 点核心要求,否则易引发死锁、锁误删、数据不一致等问题:互斥性:同一时间只有一个线程能持有锁,杜绝并发竞争&#xff1b…...

“我写的提示词生成了代码”——这算原创吗?(中国首例AI提示词著作权案庭审纪要精要)

第一章:智能代码生成与知识产权问题 2026奇点智能技术大会(https://ml-summit.org) 智能代码生成工具(如GitHub Copilot、Tabnine、CodeWhisperer)已深度融入现代开发流程,但其训练数据多源自公开代码仓库(包括GitHub…...

GLM-OCR驱动微信小程序开发:拍照取字与实时翻译

GLM-OCR驱动微信小程序开发:拍照取字与实时翻译 你有没有遇到过这样的场景?看到一份外文菜单、一份产品说明书,或者一份手写的笔记,想要快速提取上面的文字并翻译成中文,却只能一个字一个字地敲,或者来回切…...

基于cv_resnet101_face-detection_cvpr22papermogface的Java集成实战:SpringBoot服务调用

基于cv_resnet101_face-detection_cvpr22papermogface的Java集成实战:SpringBoot服务调用 想象一下,你正在为一个金融App开发用户实名认证功能,或者为一个社区门禁系统设计人脸通行模块。核心需求很明确:用户上传一张照片&#x…...

忍者像素绘卷一文详解:Z-Image-Turbo-rinaiqiao checkpoint深度解析

忍者像素绘卷一文详解:Z-Image-Turbo-rinaiqiao checkpoint深度解析 1. 产品概述与核心价值 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,专为二次元风格和复古像素艺术创作而设计。它通过独特的视觉设计和强大的技术架构&#xff0…...

Qwen3-4B模型入门教程:部署后如何确认服务正常并开始使用?

Qwen3-4B模型入门教程:部署后如何确认服务正常并开始使用? 1. 教程目标与准备工作 刚部署完Qwen3-4B模型,你可能会有这样的疑问:服务真的跑起来了吗?怎么知道模型已经准备好接受请求了?本教程将带你一步步…...

YOLO12视频流扩展:OpenCV逐帧捕获+YOLO12 API调用代码实例

YOLO12视频流扩展:OpenCV逐帧捕获YOLO12 API调用代码实例 1. 引言 实时视频分析是计算机视觉领域最激动人心的应用之一。想象一下,你需要监控一个停车场,实时统计车辆进出;或者开发一个智能家居系统,自动识别家庭成员…...

一物一码有哪些公司:快消企业如何选择合适服务商

一物一码有哪些公司:快消企业如何选择合适服务商在快消行业,渠道费用越来越高、终端动销越来越难、消费者触达越来越分散,已经成为许多企业的共同感受。相比单点式促销工具,一物一码正在从“营销活动手段”演变为“渠道、用户与产…...

AbMole 丨 FIN56 通过降解 GPX4 与调控 CoQ10 诱导铁死亡

FIN56(AbMole,M6731)是一种铁死亡(ferroptosis)诱导剂[1],其作用机理具有双重性:一方面,FIN56通过诱导谷胱甘肽过氧化物酶4(GPX4)蛋白的降解来触发铁死亡&…...

福瑞康系统APP开发功能实例分析

客户端:APP模式,H5为邀请注册码地址 服务端开发语言:PHP,JAVA 后端UI框架:‌Element Plus‌,它是基于Vue 3‌框架开发的UI组件库‌,旨在帮助开发者快速构建现代化的用户界面 。由 饿了么前端团队…...

重生之从0开始学习c++之模板初级

1. 泛型编程 —— 为什么需要模板? 如何实现一个通用的交换函数呢? void Swap(int& left, int& right) { int temp left; left right; right temp; } void Swap(double& left, double& right) { double temp left; left right; rig…...

c++怎么编写多线程安全的跨平台文件日志库_无锁队列与异步IO【附源码】

因为 std::ofstream 不是线程安全的,多个线程同时调用其 write() 等成员函数会引发数据竞争,导致未定义行为、崩溃或日志错乱。为什么直接用 std::ofstream 多线程写日志会崩多个线程同时调用 std::ofstream::write() 或 std::ios_base::failure 异常或进…...

ESP32 BLE蓝牙AT指令实战:跨厂商模块透传配置与避坑指南

1. ESP32 BLE蓝牙透传入门指南 第一次接触ESP32 BLE蓝牙透传的朋友可能会觉得有点懵,其实说白了就是让两个蓝牙设备像对讲机一样自由收发数据。我最近刚用ESP32和亿佰特E104-BT5011A模块完成了这个项目,过程中踩了不少坑,今天就把完整流程和避…...

SAP ECC6 EC-CS 合并报表操作手册(完整版)

SAP ECC6 EC-CS 合并报表操作手册(完整版)适用版本:ECC6.0(含 EHP)模块:EC-CS(Enterprise Controlling – Consolidation)核心用途:法定合并、管理合并、内部交易抵销、股…...

进阶提升!MySQL存储过程、触发器与视图实操指南

前三篇我们依次掌握了MySQL基础CRUD、进阶查询、事务、索引及数据备份,已经能满足日常开发和企业级基础数据操作需求。但在实际工作中,经常会遇到重复执行的SQL操作(如批量处理数据)、需要自动触发的业务逻辑(如数据插…...

# Bug 报告:openai-codex provider broken since 2026.4.5 �� Cloudflare challenge + missing OAuth scope /

Bug 报告:openai-codex provider broken since 2026.4.5 �� Cloudflare challenge + missing OAuth scope / openai-codex provider broken since 2026.4.5 - Cloudflare challenge + missing OAuth scope 链接: https://blog.csdn.net/cosmoslife 作者: cosmoslife 日期: 2…...

共探智能医疗与人工智能的新时代 | IHAI 2026

探索智能医疗与AI的未来 | IHAI 2026 国际会议 地点: 中国玉溪会议简介2026年智能医疗与人工智能国际会议(IHAI 2026)将于本年度在中国玉溪举行。这座融合了自然美景与多元文化的古城将迎来全球智能医疗和人工智能领域的顶尖专家、学者及行业领袖。本次大…...

告别乱码!手把手教你用LvglFontTool为LVGL嵌入式UI制作中文字库(附SPI Flash/SD卡存储方案)

嵌入式UI开发实战:LVGL中文字库高效制作与存储方案全解析 在嵌入式系统开发中,图形用户界面(GUI)的中文显示一直是开发者面临的棘手问题。当你在STM32或ESP32上使用LVGL构建交互界面时,是否遇到过这样的场景:精心设计的界面在显示…...

【硬件】2026最适合做家用NAS的CPU是哪一款

家用NAS没有绝对“唯一最优”的CPU,核心是匹配你的预算、功能需求和功耗预期。结合2026年的市场现状、软件兼容性和实测表现,以下是分场景的精准推荐,覆盖99%的家用需求,同时附上核心选型原则和避坑指南。 核心选型黄金原则&#…...

s2-pro参数调优指南:Max New Tokens与Chunk Length对语音连贯性影响

s2-pro参数调优指南:Max New Tokens与Chunk Length对语音连贯性影响 1. 引言 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,在文本转语音领域表现出色。它不仅支持基础的文本转语音功能,还能通过参考音频复用特定音色,为语…...

告别printf调试:用NRF52832的UART串口实现高效日志输出(附SDK15.3配置)

NRF52832串口日志实战:从printf到高效调试的进阶之路 调试嵌入式系统就像在黑暗房间里找钥匙——传统printf调试如同每次开灯看一眼又关上,而UART日志系统则是装上了智能照明,让问题无处遁形。对于NRF52832这样的低功耗蓝牙芯片开发者来说&am…...

商城小程序,不只是卖货这么简单

在数字化浪潮席卷各行各业的今天,商城小程序早已不是新鲜事物。但真正把商城小程序做深、做透,让它适配千行百业的差异化需求,却并非一件容易的事。我们深耕软件开发多年,发现很多客户对商城小程序的认知还停留在“线上摆个摊”的…...

洛谷 P1381 单词背诵

题目描述灵梦有 n 个单词想要背,但她想通过一篇文章中的一段来记住这些单词。文章由 m 个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个)。并且在背诵的单词量尽量多的情况下&…...

批量归一化基础:让模型训练更稳定

文章目录前言一、没BN的深度学习有多难?先懂痛点再学技术1.1 内部协变量偏移:网络每层都在“乱变”1.2 梯度消失与爆炸:深层网络的“拦路虎”1.3 调参难如登天:对初始化和学习率极度敏感二、批量归一化到底是什么?一句…...

常见网络攻击

DDoS攻击,CC攻击 CC攻击 DDoS的一种 发送大量的合法请求消耗应用层的资源(CPU,内存,数据等),耗尽资源,比如在教务网站中写死循环脚本持续访问某个资源,无技术难度 防御: 对同IP限流,验证码,行为分析 DDoS 全名分布式拒绝攻击,攻击者控制大量僵尸设备(被植入病毒的电脑,服…...

NaViL-9B多模态模型应用:智能识别图片内容,轻松实现图文对话

NaViL-9B多模态模型应用:智能识别图片内容,轻松实现图文对话 1. NaViL-9B模型概述 NaViL-9B是上海人工智能实验室研发的原生多模态大语言模型,具备同时处理文本和图像信息的能力。与传统的单一模态模型不同,NaViL-9B能够理解图片…...