首页 > 基础资料 博客日记
答疑解惑:解释在Mybatis-Spring下@Mapper与@MapperScan为何不能同时生效以及实现动态条件注册Mapper接口
2023-08-24 00:59:29基础资料围观710次
若项目中使用了@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的功能。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 小华HC32L176KATA单片机最小系统ISP烧录说明
- Windows 下切换 Java 环境太复杂了,我做了个 cli 工具,可以快速安装,切换 Java 版本
- SHP文件与PostGIS数据库Geom字段:WKT和EWKB相互转换SQL
- Spring AI 2.0 GA 倒计时:先别急,来看看 Java AI 框架的另一条路
- HEIC 批量转 JPG - 一键转换苹果 HEIC 格式为 JPG/PNG,保留 EXIF 信息,支持批量处理
- 【php】老旧PHP项目(PHP 5.6)本地环境搭建与踩坑记录
- Vue3 轻量安全滑动拼图验证码:vue-sliding-puzzle 上手全攻略
- 多市场行情时间戳对齐:UTC 存储的夏令时陷阱与数据库设计方案
- 15. 别再硬写提示词了!LangChain ChatPromptTemplate核心实战
- 一次 OOM 线上排查实录

