从MyBatis-Plus看Spring Boot自动配置原理

news2025/2/11 8:44:02

一、问题引入:神秘的配置生效之谜

当我们使用MyBatis-Plus时,只需在pom.xml中添加依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

然后在application.properties中配置:

mybatis-plus.mapper-locations=classpath*:mapper/*.xml

问题来了:我们既没有在代码中显式读取这个配置,也没有手动创建相关Bean,这些参数究竟是如何生效的?这就是Spring Boot自动配置的魔法所在!

二、Spring Boot自动配置机制揭秘

2.1 核心注解剖析

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这个注解等价于:

@SpringBootConfiguration
@EnableAutoConfiguration  // 开启自动配置的核心注解
@ComponentScan

2.2 自动配置流程

  1. 触发机制:通过@EnableAutoConfiguration激活自动配置

  2. 配置收集:扫描所有META-INF/spring.factories文件

  3. 条件过滤:通过条件注解筛选有效配置类

  4. 执行顺序:通过@AutoConfigureOrder@AutoConfigureAfter控制加载顺序

  5. 配置生效:创建符合条件的Bean并加入IOC容器

2.3 条件注解全家福

注解名称生效条件
@ConditionalOnClass类路径存在指定类时生效
@ConditionalOnMissingBean容器中不存在指定Bean时生效
@ConditionalOnProperty配置文件中存在指定属性时生效
@ConditionalOnWebApplicationWeb应用环境下生效

三、MyBatis-Plus自动配置深度解析

3.1 自动配置入口

mybatis-plus-boot-starterMETA-INF/spring.factories中:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

3.2 核心配置类分析

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@EnableConfigurationProperties(MybatisPlusProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisPlusAutoConfiguration {
    // 核心配置逻辑
}

注解解析

  • @ConditionalOnClass:确保MyBatis核心类存在

  • @EnableConfigurationProperties:绑定配置属性

  • @AutoConfigureAfter:确保数据源先配置完成

3.3 配置属性绑定

@ConfigurationProperties(prefix = "mybatis-plus")
public class MybatisPlusProperties {
    private String[] mapperLocations;
    private String typeAliasesPackage;
    private Class<?> typeEnumsPackage;
    // 其他配置项及getter/setter
}

属性映射过程

  1. Spring Boot启动时扫描@ConfigurationProperties

  2. application.propertiesmybatis-plus前缀的配置

  3. 通过Setter方法注入到MybatisPlusProperties实例

3.4 SqlSessionFactory自动配置

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setMapperLocations(
        Stream.of(properties.getMapperLocations())
              .flatMap(loc -> Arrays.stream(resources.getResources(loc)))
              .toArray(Resource[]::new)
    );
    // 其他配置项处理...
    return factory.getObject();
}

关键逻辑

  • 自动注入DataSource(来自数据源自动配置)

  • 解析mapper.xml路径(支持Ant风格路径)

  • 处理类型别名、插件等扩展配置

3.5 Mapper接口注册机制

@Bean
@ConditionalOnMissingBean
public MapperScannerConfigurer mapperScannerConfigurer() {
    MapperScannerConfigurer configurer = new MapperScannerConfigurer();
    configurer.setBasePackage("${mybatis-plus.mapper-package}");
    return configurer;
}

扫描规则

  1. 默认扫描@Mapper注解的接口

  2. 支持通过配置mybatis-plus.mapper-package指定扫描路径

  3. 自动将接口代理实现类注册为Spring Bean

3.6 条件配置的精妙之处

@ConditionalOnMissingBean(SqlSessionFactory.class)
public class MybatisPlusAutoConfiguration {
    // 当用户没有自定义SqlSessionFactory时生效
}

这种设计实现了:

  1. 开箱即用:默认配置满足大部分场景

  2. 灵活覆盖:允许用户自定义Bean来替代自动配置

  3. 按需加载:只有相关依赖存在时才生效

四、自动配置的调试技巧

4.1 查看生效的自动配置类

启动时添加VM参数:

-Ddebug=true

输出示例:

MybatisPlusAutoConfiguration matched:
   - @ConditionalOnClass found required classes [...]
   - @ConditionalOnMissingBean [...] none found

4.2 排除指定自动配置类

@SpringBootApplication(exclude = {MybatisPlusAutoConfiguration.class})

五、最佳实践建议

  1. 谨慎覆盖:尽量通过配置参数调整,而非直接覆盖自动配置Bean

  2. 明确扫描路径:明确指定@MapperScan("com.xxx.mapper")

  3. 版本对齐:保持starter父工程与MyBatis-Plus版本一致

  4. 配置检查:善用spring.config.activate.on-profile进行环境隔离

六、总结

通过分析MyBatis-Plus的自动配置实现,我们可以深入理解Spring Boot自动配置的三大核心:

  1. 约定优于配置:通过标准化配置路径和命名减少样板代码

  2. 条件化装配:智能判断运行环境,按需加载组件

  3. 扩展机制:通过starter和spring.factories实现模块化装配

这种设计使得Spring Boot应用既能快速启动,又保持了高度的灵活性,堪称框架设计的典范。掌握自动配置原理,就能在遇到配置问题时快速定位,在需要扩展时游刃有余。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 0基础…

Chapter3:结构化程序设计

参考书籍&#xff1a;《C#边做边学》&#xff1b; 3.结构化程序设计 3.1 结构化程序设计的3种基本结构 顺序结构&#xff1a;先执行 A {\rm A} A语句&#xff0c;再执行 B {\rm B} B语句&#xff0c;两者是顺序执行的关系&#xff1b; 选择结构&#xff1a;根据所定选择条件为…

白话文实战Nacos(保姆级教程)

前言 上一篇博客 我们创建好了微服务项目,本篇博客来体验一下Nacos作为注册中心和配置中心的功能。 注册中心 如果我们启动了一个Nacos注册中心,那么微服务比如订单服务,启动后就可以连上注册中心把自己注册上去,这过程就是服务注册。每个微服务,比如商品服务都应该注册…

智能理解 PPT 内容,快速生成讲解视频

当我们想根据一版 PPT 制作出相对应的解锁视频时&#xff0c;从撰写解锁词&#xff0c;录制音频到剪辑视频&#xff0c;每一个环节都需要投入大量的时间和精力&#xff0c;本方案将依托于阿里云函数计算 FC 和百炼模型服务&#xff0c;实现从 PPT 到视频的全自动转换&#xff0…

IEC61850标准下的数据和数据模型服务的详细介绍

目录 一、摘要 二、概述 三、详细介绍 1、读服务器目录(GetServerDirectory) 2、读逻辑设备目录(GetLogicalDeviceDirectory) 3、读逻辑节点目录(GetLogicalNodeDirectory) 4、读全部数据值(GetAllDataValues) 5、读数据值(GetDataValues) 6、设置数据值(SetDataValues…

R语言LCMM多维度潜在类别模型流行病学研究:LCA、MM方法分析纵向数据

全文代码数据&#xff1a;https://tecdat.cn/?p39710 在数据分析领域&#xff0c;当我们面对一组数据时&#xff0c;通常会有已知的分组情况&#xff0c;比如不同的治疗组、性别组或种族组等&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 然而&#xff0c;…

5. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Nacos

一、什么是Nacos Nacos 是阿里巴巴开源的一款云原生应用基础设施&#xff0c;它旨在简化微服务架构中服务治理和配置管理的复杂性。通过 Nacos&#xff0c;服务在启动时可以自动注册&#xff0c;而其他服务则可以通过名称来查找并访问这些注册好的实例。同时&#xff0c;Nacos…

VUE项目中实现权限控制,菜单权限,按钮权限,接口权限,路由权限,操作权限,数据权限实现

VUE项目中实现权限控制&#xff0c;菜单权限&#xff0c;按钮权限&#xff0c;接口权限&#xff0c;路由权限&#xff0c;操作权限&#xff0c;数据权限实现 权限系统分类&#xff08;RBAC&#xff09;引言菜单权限按钮权限接口权限路由权限 菜单权限方案方案一&#xff1a;菜单…

【网络安全】服务器安装Docker及拉取镜像教程

文章目录 1. 安装 Docker2. 拉取镜像3. 运行 Ubuntu 容器4. 执行相关操作5. 退出并停止容器1. 安装 Docker # 更新软件包索引 sudo apt update# 安装必要的依赖 sudo apt install -y ca-certificates curl gnupg

elementplus 使用日期时间选择器,设置可选范围为前后大于2年且只能选择历史时间不能大于当前时间点

需求&#xff1a;时间选择器可选的时间范围进行限制&#xff0c;-2年<a<2年且a<new Date().getTime()核心&#xff1a;这里需要注意plus版没有picker-options换成disabled-date属性了&#xff0c;使用了visible-change和calendar-change属性逻辑&#xff1a;另设一个参…

将 AMD Zynq™ RFSoC 扩展到毫米波领域

目录 将 AMD Zynq™ RFSoC 扩展到毫米波领域Avnet XRF RFSoC 系统级模块适用于 MATLAB 的 Avnet RFSoC Explorer 工具箱5G mmWave PAAM 开发平台突破性的宽带毫米波波束成形特征&#xff1a;OTBF103 Mathworks Simulink 模型优化毫米波应用中的射频信号路径 用于宽带毫米波上/下…

Redis企业开发实战(五)——点评项目之分布式锁Redission与秒杀优化

目录 一、Redisson (一)Redisson基本介绍 (二)Redisson入门 1.引入依赖 2.配置Redisson客户端 3.使用Redission的分布式锁 4.tryLock参数解析 4.1tryLock() 4.2tryLock(long waitTime, TimeUnit unit) 4.3tryLock(long waitTime, long leaseTime, TimeUnit unit) 4…

IDEA安装离线插件(目前提供了MavenHelper安装包)

目录 1、离线安装方式2、Maven Helper 1、离线安装方式 首先访问 IDEA插件网站 下载离线插件安装包&#xff0c;操作如下&#xff1a; 然后打开IDEA的Settings配置&#xff0c;点击Plugins&#xff0c;点击右侧设置按钮&#xff08;齿轮&#xff09;&#xff0c;选择Install P…

LabVIEW 开发航天项目软件

在航天项目软件开发中&#xff0c;LabVIEW 凭借其图形化编程优势被广泛应用。然而&#xff0c;航天项目的高可靠性、高精度及复杂环境适应性要求&#xff0c;使得在使用 LabVIEW 开发时&#xff0c;有诸多关键要点需要特别关注。本文将详细分析在开发航天项目软件时需要重点注意…

互联网大厂中面试的高频计算机网络问题及详解

前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 先来说说计算机网…

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…

自然语言处理NLP_[1]-NLP入门

文章目录 1.自然语言处理入门1. 什么是自然语言处理2.自然语言处理的发展简史3 自然语言处理的应用场景1. **机器翻译**2. **文本分类**3. **情感分析**4. **问答系统**5. **文本生成**6. **信息抽取**7. **语音识别与合成**8. **文本摘要**9. **搜索引擎优化**10. **聊天机器人…

计算机毕业设计Python+Spark知识图谱医生推荐系统 医生门诊预测系统 医生数据分析 医生可视化 医疗数据分析 医生爬虫 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Selenium常用自动化函数

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1.元素的定位 1.1 定位步骤 1,要想定位,就先打开开发者工具 2,先点击左上角图标 1.2 cssSelector 1.3 xpath 2.操作测…

【故障排除】ls: command not found 终端命令失效的解决办法

【TroubleShooting】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal&#xff0c;并且为她定制了不同的Profile。 这样&#xff0c;看起来她可以在不同季节&#xff0c…