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

ops/2025/2/13 20:46:54/

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

当我们使用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.ppmy.cn/ops/158129.html

相关文章

Vision Transformer:打破CNN垄断,全局注意力机制重塑计算机视觉范式

目录 引言 一、ViT模型的起源和历史 二、什么是ViT&#xff1f; 图像处理流程 图像切分 展平与线性映射 位置编码 Transformer编码器 分类头&#xff08;Classification Head&#xff09; 自注意力机制 注意力图 三、Coovally AI模型训练与应用平台 四、ViT与图像…

App UI自动化--Appium学习--第二篇

如果第一篇在运行代码的时候出现问题&#xff0c;建议参考我的上一篇文章解决。 1、APP界面信息获取 adb logcat|grep -i displayed代码含义是获取当前应用的包名和界面名。 根据日志信息修改代码当中的包名和界面名&#xff0c;就可以跳转对应的界面。 2、界面元素获取 所…

Seaweedfs(master volume filer) docker run参数帮助文档

文章目录 进入容器后执行获取weed -h英文中文 weed server -h英文中文 weed volume -h英文中文 关键点测试了一下&#xff0c;这个-volume.minFreeSpace string有点狠&#xff0c;比如设置值为10&#xff08;10%&#xff09;&#xff0c;它直接给系统只留下10%的空间&#xff0…

python+unity落地方案实现AI 换脸融合

先上效果再说技术结论&#xff0c;使用的是自行搭建的AI人脸融合库&#xff0c;可以离线不受限制无限次生成&#xff0c;有需要的可以后台私信python ai换脸融合。 TODO 未来的方向&#xff1a;3D人脸融合和AI数据训练 这个技术使用的是openvcinsighface&#xff0c;openvc…

支持向量机原理

支持向量机&#xff08;简称SVM&#xff09;虽然诞生只有短短的二十多年&#xff0c;但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法&#xff0c;不考虑特定的训练数据集&#xff0c;尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…

华为云的分布式缓存服务适合什么场景

华为云的分布式缓存服务&#xff08;DCS&#xff09;适用于多种场景&#xff0c;能够有效提升系统的性能和可靠性。以下是九河云总结的其主要适用场景&#xff1a; 高并发读取场景 在电商、社交平台等高并发应用中&#xff0c;华为云DCS可以将热点数据缓存到内存中&#xff0c…

【MySQL】常用语句

目录 1. 数据库操作2. 表操作3. 数据操作&#xff08;CRUD&#xff09;4. 高级查询5. 索引管理6. 用户与权限7. 数据导入导出8. 事务控制9. 其他实用语句注意事项 如果这篇文章对你有所帮助&#xff0c;渴望获得你的一个点赞&#xff01; 1. 数据库操作 创建数据库 CREATE DATA…

Linux 系统中,进程间通信机制

在 Linux 系统中&#xff0c;进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是多个进程之间交换数据和同步操作的机制。Linux 提供了多种 IPC 方式&#xff0c;每种方式适用于不同的场景。以下是常见的 IPC 方式及其详解&#xff1a; 1. 管道&#xff08…