若项目中使用了@MapperScan注解后,则@Mapper注解不再生效

原因是:@MapperScan注解 会执行@Import(MapperScannerRegistrar.class),而MapperScannerRegistrar又会注册MapperScannerConfigurer BEAN,在MapperScannerConfigurer BEAN中会完成基于配置的包目录扫描注册所有mapper interface代理BEAN,而@Mapper注解的生效是由org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.MapperScannerRegistrarNotFoundConfiguration 配置BEAN类执行@Import(AutoConfiguredMapperScannerRegistrar.class),在AutoConfiguredMapperScannerRegistrar中会扫描所有@Mapper注解的mapper interface并注册为代理BEAN,但在执行@Import(AutoConfiguredMapperScannerRegistrar.class)时有一个前提,那就是@ConditionalOnMissingBean({ MapperFactoryBean.class, MapperScannerConfigurer.class })【即:在没有MapperFactoryBean 或 MapperScannerConfigurer】时才会执行,由于MapperScannerRegistrarNotFoundConfiguration 是MybatisAutoConfiguration 配置BEAN的子类,所以MapperScannerRegistrarNotFoundConfiguration 会晚于@MapperScan标记的顶级类,故正常情况下一旦使用了@MapperScan注解后,由于MapperScannerConfigurer BEAN已注册,那么MapperScannerRegistrarNotFoundConfiguration 上的@Import(AutoConfiguredMapperScannerRegistrar.class)将不会被执行。

另外要实现动态条件注册Mapper接口,我们只需要在mapper interface上加上@Conditional(...) 条件注解即可

原理是:不论是@MapperScan 或是@Mapper 最终都是使用ClassPathMapperScanner.scan完成扫描并注册成BEAN的,而在scan过程中又会支持较多的TypeFilter,以及在确定候选组件时(org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents)又会进行条件判断(即:org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#isConditionMatch),判断是否可以跳过(即:org.springframework.context.annotation.ConditionEvaluator#shouldSkip),在shouldSkip方法中会又会判断是否为Conditional注解,若是则会执行Condition#matches 进行匹配,若返回true则表示符合要求不跳过(即:候选的BEAN),否则跳过,如此即实现了动态条件注册Mapper接口代理BEAN的功能。

答疑解惑:解释在Mybatis-Spring下@Mapper与@MapperScan为何不能同时生效以及实现动态条件注册Mapper接口的更多相关文章

  1. Mybatis+Spring的整合练习

    一.建立数据库.建表 二.新建maven项目 三.添加依赖 <dependencies> <dependency> <groupId>junit</group ...

  2. idea插件(mybatis框架下mapper接口快速跳转对应xml文件)亲测好用!

    我相信目前在绝大部分公司里,主要使用的框架是S(spring)S(spring MVC)M(mybatis),其中mybatis总体架构是编写mapper接口,框架扫描其对应的mapper.xml文件 ...

  3. Spring和mybatis整合 org.mybatis.spring.mapper.MapperScannerConfigurer

    在springmvc与mybatis整合时,需要对每一个mapper定义对应的一个MapperFactoryBean,可以使用MapperScannerConfigurer自动扫描mapper,然后自 ...

  4. mybatis整合spring下的的各种配置文件

    1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  5. org.mybatis.spring.mapper.MapperScannerConfigurer 类作用

    1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property nam ...

  6. spring+springMVC+Mybatis架构下采用AbstractRoutingDataSource、atomikos、JTA实现多数据源灵活切换以及分布式事务管理

    背景: 1.系统采用SSM架构.需要在10多个MYSQL数据库之间进行切换并对数据进行操作,上篇博文<springMVC+Mybatis(使用AbstractRoutingDataSource实 ...

  7. 多个mapper location时, mybatis spring的自动扫描配置

    1. MapperScannerConfigurer 里面的basePackage, 多个package用逗号分隔 2. SqlSessionFactoryBean里面的mapperLocations ...

  8. Spring 下 MyBatis 的基本使用

    参看代码 GitHub : pom.xml dbconfig.properties DbConfig.java MySqlBean.java User.java UserMapper.java Use ...

  9. Mybatis+Spring整合后Mapper测试类编写

    public class UserMapperTest { private ApplicationContext applicationContext; @Before public void ini ...

  10. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0'

    七月 05, 2018 10:26:54 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRul ...

随机推荐

  1. JAVA使用Session获取用户信息

    JAVA使用Session获取用户信息 1. 在登录的Controller中将用户信息塞入Session //前端传入用户信息 @RequestMapping("/login") ...

  2. vue tabBar导航栏设计实现3-进一步抽取tab-item

    系列导航 一.vue tabBar导航栏设计实现1-初步设计 二.vue tabBar导航栏设计实现2-抽取tab-bar 三.vue tabBar导航栏设计实现3-进一步抽取tab-item 四.v ...

  3. 全流程机器视觉工程开发(一)环境准备,paddledetection和labelme

    前言 我现在在准备做一个全流程的机器视觉的工程,之前做了很多理论相关的工作.大概理解了机器视觉的原理,然后大概了解了一下,我发现现在的库其实已经很发展了,完全不需要用到非常多的理论,只需要知道开发过程 ...

  4. C#多曲线数据分析

    数据如下 统计效果图如下 程序初始化 private void Form1_Load(object sender, EventArgs e) { using (SqlConnection con = ...

  5. MyBatis03——ResultMap和分页相关

    ResultMap和分页相关 当属性名和字段名不一致的时候 解决方法 1.数据库中创建user表 字段 id.name.pwd 2.Java中的实体类 @Data public class User ...

  6. [转帖]2024年正常使用windows XP之一:系统下载篇

    https://zhuanlan.zhihu.com/p/347764175 半夏:2024年正常使用windows XP之一:系统下载篇 半夏:2024年正常使用windows XP之二:补丁及运行 ...

  7. [转帖]数据库Ingres、Oracle、PostgreSQL、MySQL的历史总结

    http://www.codeforest.cn/article/192# Ingres 1973年,加州大学伯克利分校的Michael Stonebraker和EugeneWong,从Edgar F ...

  8. [转帖]JVM 输出 GC 日志导致 JVM 卡住,我 TM 人傻了

    https://www.jianshu.com/p/51380e04eab1 最近,我们升级了 Java 17.后来,我们的 k8s 运维团队为了优化我们的应用日志采集, 将我们所有 pod (你可以 ...

  9. [转帖]Prometheus 监控之 Blackbox_exporter黑盒监测 [icmp、tcp、http(get\post)、dns、ssl证书过期时间]

    Blackbox_exporter 主动监测主机与服务状态 Prometheus 官方提供的 exporter 之一,可以提供 http.dns.tcp.icmp 的监控数据采集 官方github: ...

  10. minio性能测试

    minio性能测试 minio的使用 前期使用了s3fs 但是想验证一下性能相关, 所以使用今天简单验证了一下, 其实也可以使用一下fio 但是s3fs 是对象存储 没有修改 只有上传, 所以感觉还是 ...