启动过程中,Mapper接口的扫描与代理注册
整体流程
简易流程图
整体流程创建扫描器实例扫描器根据配置注册过滤器扫描器进行扫描扫描后获取bean定义交给Spring进行加载spring通过MapperFactoryBean获取到Mapper的代理对象结束
文本概括
- 创建扫描器实例
- 如何使用的是@MapperScan,@MapperScan中配置了@Import(MapperScannerRegistrar.class)注解 会使MapperScannerRegistrar类在启动时自动加载 (待-见spring学习)
- MapperScannerRegistrar 并加载 registerBeanDefinitions 方法
- 创建扫描器实例
- 设置resourceLoader属性(资源加载器)
- 设置Annotation属性(被修饰的注解)
- 设置markerInterface属性(继承的父类)
- 设置ameGenerator属性(名字生成器)
- 设置factoryBean属性 (工厂bean对象)
- 设置SqlSessionTemplateBeanName属性 (指定使用的SqlSessionTemplate、通常多个数据源使用)
- 设置basePackages属性 (要扫描的包)
- 创建扫描器实例
- MapperScannerRegistrar 并加载 registerBeanDefinitions 方法
- 如果在mapper接口上配置@Mapper注解后,MybatisAutoConfiguration中的内部类AutoConfiguredMapperScannerRegistrar
- 执行registerBeanDefinitions方法
- 创建扫描器实例
- 设置resourceLoader属性(资源加载器)
- 设置Annotation属性(被修饰的注解)设置值为Mapper.class
- 创建扫描器实例
- 执行registerBeanDefinitions方法
- 如何使用的是@MapperScan,@MapperScan中配置了@Import(MapperScannerRegistrar.class)注解 会使MapperScannerRegistrar类在启动时自动加载 (待-见spring学习)
- 扫描器注册过滤器
- 判断是否设置了Annotation类型,如果设置了添加指定注解类型的过滤器
- 判断是否设置了markerInterface属性,如果设置了添加指定父类的过滤器
- 如果以上属性没有被设置,添加默认的过滤器(直接返回true - 不过滤)
- 添加 package-info.java 过滤器
- 扫描器进行扫描
- 将包路径交给父类扫描(org.springframework.context.annotation.ClassPathBeanDefinitionScanner)扫描
- 对扫描后得到的bean定义持有者们进行遍历
- 获取bean定义
- 设置bean定义的 原类型和bean类(mapperFactoryBean)
- bean定义中添加属性 addToConfig
- 如果设置了sqlSessionTemplate 或者 设置了sqlSessionFactory的话,将bean定义自定注入类型设置为 AUTOWIRE_BY_TYPE (根据类型)
- bean定义修改好后,将bean定义交给 springbean的注册实例方法 进行实例化
- 最终调用org.mybatis.spring.mapper.MapperFactoryBean#getObject获取mapper的代理实例
- 调用SqlSession获取Mapper实例
- 在SqlSession中获取configuration对象,通过configuration获取Mapper实例
- 在configuration中获取mapperRegistry对象,在mapperRegistry中获取Mapper实例
- 通过mapperRegistry中的knownMappers(Key(接口class),value该接口的代理工厂对象)获取到代理工厂对象 (在启动时解析mapper.xml中sql的时候存储的 方法 -> xmlMapperBuilder.parse())
- 通过代理工厂对象获取代理实例
- 通过SqlSession创建代理对象
- 将代理对象交给代理,代理的类为mapper接口
- 最终调用org.mybatis.spring.mapper.MapperFactoryBean#getObject获取mapper的代理实例
springboot启动类配置@MapperScan
源码解析(MapperScannerRegistrar.registerBeanDefinitions)
1 | scss复制代码 @Override |
接口上配置@mapper注解
在MybatisAutoConfiguration中有一个内部类:AutoConfiguredMapperScannerRegistrar,内部类AutoConfiguredMapperScannerRegistrar实现了ImportBeanDefinitionRegistrar接口,在spring项目启动时会执行registerBeanDefinitions方法
源码解析(AutoConfiguredMapperScannerRegistrar#registerBeanDefinitions)
1 | typescript复制代码 @Override |
通用方法
源码解析(registerFilters)
1 | java复制代码public void registerFilters() { |
源码解析(doScan)
1 | kotlin复制代码 @Override |
获取代理BEAN
源码解析(MapperFactoryBean#getObject)
1 | typescript复制代码 @Override |
文章链接
- 【Myabtis】- 1. 整合spring boot后启动流程
- 【Mybatis】- 1.1 启动过程中,Mapper接口的扫描与代理注册
- 【Mybatis】- 1.2 启动过程中,Mapper.xml的解析
- 【Mybatis】- 2. SQL语句的执行过程
- 【Mybatis-附件1】- Mapper.xml 参数配置以及含义
本文转载自: 掘金