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

这篇具有很好参考价值的文章主要介绍了答疑解惑:解释在Mybatis-Spring下@Mapper与@MapperScan为何不能同时生效以及实现动态条件注册Mapper接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

若项目中使用了@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的功能。文章来源地址https://www.toymoban.com/news/detail-667182.html

到了这里,关于答疑解惑:解释在Mybatis-Spring下@Mapper与@MapperScan为何不能同时生效以及实现动态条件注册Mapper接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【官方中文文档】Mybatis-Spring #搭配 Spring Boot

    请查看 MyBatis Spring-boot-starter 子项目获取更多信息。

    2024年02月11日
    浏览(33)
  • spring5源码篇(9)——mybatis-spring整合原理

    spring-framework 版本:v5.3.19 spring和mybatis的整合无非主要就是以下几个方面: 1、SqlSessionFactory怎么注入? 2、Mapper代理怎么注入? 3、为什么要接管mybatis事务? 在mybatis-spring中,定义了一个新的factoryBean——SqlSessionFactoryBean,我们将其注入到spring容器即可。 其实也不难猜到,这

    2024年02月03日
    浏览(31)
  • 【官方中文文档】Mybatis-Spring #使用 SqlSession

    在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession 。 一旦你获得一个 session 之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭 session。 使用 MyBatis-Spring 之后,你不再需要直接使用 SqlSessionFactory 了,因为你的 bean 可以被

    2024年02月11日
    浏览(33)
  • 【官方中文文档】Mybatis-Spring #注入映射器

    与其在数据访问对象(DAO)中手工编写使用 SqlSessionDaoSupport 或 SqlSessionTemplate 的代码,还不如让 Mybatis-Spring 为你创建一个线程安全的映射器,这样你就可以直接注入到其它的 bean 中了: 注入完毕后,映射器就可以在你的应用逻辑代码中使用了: 注意代码中并没有任何的对

    2024年02月11日
    浏览(31)
  • Spring(九) - 解惑 spring 嵌套事务.2

        1. 事务传播特性             在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看,绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义, 让我们来看一下 TransactionDefinition 接口中的定义 Java代码  我们可

    2024年02月14日
    浏览(40)
  • 基于uniapp的微信小程序spring boot商品进销存储系统[源码+文档+远程+答疑

     网站介绍:✌本网站专注专注于计算机技术领域的毕业设计辅导,提供JAVA、微信小程序、Python、APP、PHP、微服务、NET等毕设项目的定制和成品服务!✌         ✌IT实战营站长,拥有10年软件相关系统架构及教学经验,Java、大数据培训讲师,曾任公司技术总监;其与团队

    2024年02月21日
    浏览(46)
  • Spring Boot + RabbitMQ 配置参数解释

    spring.rabbitmq.host: 服务Host spring.rabbitmq.port: 服务端口 spring.rabbitmq.username: 登陆用户名 spring.rabbitmq.password: 登陆密码 spring.rabbitmq.virtual-host: 连接到rabbitMQ的vhost spring.rabbitmq.addresses: 指定client连接到的server的地址,多个以逗号分隔(优先取addresses,然后再取host) spring.rabbitmq.requested

    2024年01月24日
    浏览(40)
  • 详细解释一下Spring是如何解决循环依赖问题的

    我们都知道,如果在代码中,将 两个或多个Bean互相之间持有对方的引用就会发生循环依赖。循环的依赖将会导致注入死循环 ,这是Spring发生循环依赖的原因 1. 互相依赖: A依赖B , B依赖A , 他们之间形成了循环依赖 2. 间接依赖: A依赖B ,B依赖C , C又依赖A,形成了循环依

    2024年02月09日
    浏览(37)
  • 解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

    解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义语言的文法,并且解释语言中的表达式。在Java中,解释器模式可以用于构建解释器以解析特定的语言或表达式,如数学表达式、查询语言等。 优点: 灵活性: 解释器模式可以 灵活地添加新的表达式和规则 ,因

    2024年02月19日
    浏览(47)
  • 35、解释一下spring支持的几种bean的作用域

    singleton: 默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。该对象的生命周期是与Spring IOC容器一致的 (但在第一次被注入时才会创建)。 prototype:为每一个bean请求提供一个实例。在每次注入时都会创建一个新的对象· request: bean被定义为在每个HTTP请求中

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包