点进MapperScan这个注解,可以看到注入了这个类MapperScannerRegistrar

点进这个类,可以看到继承了ImportBeanDefinitionRegistrar接口,实现了regidterBeanDefinition()方法,也就是说在spring容器扫描完,处理BeanDefinitionMap的时候,调用了这个扩展接口。

而这个方法主要做的就是向beanDefinitionMap中添加了一个类,叫MapperScannerConfigurer

点进这个类MapperScannerConfigurer,可以看到它继承了BeanDefinitionRegistryPostProcessor,

那就以为意味着,一定会执行这个方法postProcessBeanDefinitionRegistry()
这个方法的主要作用是构造了一个mybatis的扫描器
其中需要注意的点就是这个方法

这个方法是在扫描器中添加了几个过滤器,
第一个annotationClass:是指在扫描的注解中如果有annotationClass属性的话,那么扫描到的类,就必须要添加属性中指定的注解,才会被处理。 如:@MapperScan(value = “com.spring.batis.dao”, annotationClass = Mapper.class) ,只有扫描到的类,都加了Mapper注解的话,才会被mybatis代理

第二个markerInterface:这个里面直接返回了false,包下面所有的接口都不扫描了

第三个是acceptAllInterfaces:这个里面直接返回了true,意思是所有扫描到的接口全都处理。这可以解释一下这个lambda表达式。它传入的是 TypeFilter类,所以这行代码等同于

addIncludeFilter((metadataReader, metadataReaderFactory) -> true);//等同于addIncludeFilter(new TypeFilter() {@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {return true;}});

第四个一般都是没有这个类,可以忽略。

再回到postProcessBeanDefinitionRegistry()方法中,看他的scan()方法

scan()方法是在父类ClassPathBeanDefinitionScanner中执行,而其中的doScan()方法又到了子类过滤器ClassPathMapperScanner中执行。

虽然最终执行的还是父类doScan()方法,但是这个下面的代码是很重要的。

那这个doScan()方法又回到了spring的源码中了,我们已经分析过如何扫描个过滤的。

spring boot如何扩展mybatis

按照上面的源码分析,也就是说,如果MapperScan注解中不加annotation这个属性去指定Mapper注解的话,就可以扫描指定包下面的所有接口。
那么为什么springBoot不需要写MapperScan注解,但是需要将mybatis接口类上写@Mapper注解呢,如果不写的话这个mapper接口就不会生效。

大概说一下,就是springboot不需要手动添加MapperScan,它会自动通过mybatis-spring-boot-starter中的配置类,进行扫描,而扫描的时候,添加了一个Mapper注解的过滤器。也就是说,扫描到的接口类,只有添加了@Mapper注解的才会作为mapper来处理。
所以我们在使用springBoot进行开发的时候,尽量把mapper接口文件放在同一个中,并且统一添加mapper注解。

spring源码之Mybatis扫描器相关推荐

  1. 程序员如何应对中年危机,撸了大神写的spring源码笔记,超详细

    前言: 我们通常在面试的时候难免会慌张不已.想必,经历过的人都能体会.但是如果你提前预测和准备面试官要问你的问题,并想出合理的回答方式,就会轻松很多.所以接下来的面试题是我从自己和其他人的面试经历中总 ...

  2. spring源码学习之整合Mybatis原理分析

    本文主要解析spring是如何与mybatis进行整合,整合的过程中需要哪些组件的支持.以前面提到过的配置例子<spring源码学习之aop事物标签解析> 整合的过程中需要使用以下这个依赖 ...

  3. Spring源码分析八:Mybatis ORM映射框架原理

    文章目录 (一)Mybatis单独操作数据库程序 1.1.数据库表 1.2.建立PO 1.3.建立mapper接口映射 1.4.建立Mybatis配置文件 1.5.建立mapper映射文件 1.6.测 ...

  4. 《Spring源码深度解析 郝佳 第2版》JDBC、MyBatis原理

    往期博客 <Spring源码深度解析 郝佳 第2版>容器的基本实现与XML文件的加载 <Spring源码深度解析 郝佳 第2版>XML标签的解析 <Spring源码深度解 ...

  5. Spring源码深度解析(郝佳)-学习-源码解析-Spring整合MyBatis

    了解了MyBatis的单独使用过程之后,我们再来看看它也Spring整合的使用方式,比对之前的示例来找出Spring究竟为我们做了什么操作,哪些操作简化了程序开发. 准备spring71.xml &l ...

  6. 装饰器模式在MyBatis以及Spring源码中的应用

    结构型模式                 ----顺口溜:适装桥组享代外 目录 1.装饰器模式 1.1 装饰器模式UML图 1.2 日常生活中看装饰器模式 1.3 使用场景 1.4 Java代码实现 ...

  7. Spring源码之BeanDifinition(加几行代码,可以产出让队友几天也找不出的Bug)

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger 种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq ...

  8. Spring源码编译教程(自己复习) 作者 周瑜

    1.Spring底层核心原理解析 作者:周瑜 笔记在线更新版:0_0 牛逼的Spring · 语雀 本节课会把Spring中核心知识点都给大家进行串讲,让大家对Spring的底层有一个整体的大致了解, ...

  9. 『互联网架构』软件架构-spring源码之spring结构概述

    spring从07年接触到目前2018年也差不多10年了,一个java的框架为什么能火这么多年.很多人对spring的使用轻车熟路,但是从未解读过spring的源码,老铁跟我一起看看源码,了解下内部的 ...

最新文章

  1. 什么是原码、反码、补码?什么是按位与?范围数字按位与!
  2. java 做计算器 百度云_用Java做一个简单的计算器
  3. java vo转map_三分钟掌握POJO及其转换——PO、DO、DTO、VO
  4. swoole UDP TCP客户端
  5. 【实用】批量成本估算
  6. 马云、马斯克同台谈AI:人工智能拯救世界?
  7. node.js 执行php,node.js - 如何利用php执行nodejs文件
  8. 冒泡排序-----选择排序1-2
  9. login aspx实现登陆功能 400电话
  10. 简介如何查看执行计划以及执行计划的准确性
  11. 土豪聪要请客(题解)
  12. php如何获取当前的cookie,怎么获取cookie的值
  13. 游戏缺少d3dx9_XX.dll文件的解决办法
  14. python 规则引擎 drools_Drools 规则引擎环境搭建
  15. uni-app开发环境配置及混合开发流程
  16. 双ESP分区的WinPE本地安装
  17. 架构师须知概念:POJO、PO、DTO、DAO、BO、VO
  18. 已解决IndentationError: unindent does not match any outer indentation level
  19. 关于es8316的音频爆破音的解决
  20. 在CSDN中如何上传附件(资源)?

热门文章

  1. NFS配置(RHCE考试题)
  2. 勿在浮沙筑高台之“字符串编码”
  3. 2018尚硅谷SpringBoot视频教程附代码+笔记+课件(内含Docker)
  4. 双系统linux触摸板不能用,windows系统与ubuntu双系统导致笔记本触摸板失灵的解决办法(非输入代码)...
  5. 苹果手机很卡怎么解决_iPhone很卡怎么办,教您如何解决iPhone很卡问题!
  6. UG NX 12抽取体特征
  7. 《Python多人游戏项目实战》第一节 简单的方块移动
  8. VBA中Sheets(String)和Sheets(Long)的速度
  9. Lory的编程之旅就此启动
  10. 如何用iMazing软件将苹果手机数据备份及功能详解