Spring如何管理Mapper

一、背景

在Controller中使用Service,一般是实现Service接口类上添加@Service注解,让实现类注入到SpringIoc容器中,Controller通过@Autowired 从容器中获取,但是在Service实现类中使用@AutoWired 获取Mapper的时候,没有看到Mapper的实现类,带着疑问查看Spring是如何把Mapper接口类型的类注入到Ioc容器中。

二、猜测

Spring的bean生成过程 。 Spring启动过程中,大致会经过如下步骤去生成bean:
扫描@ComponentScan中指定的包路径下的class文件
根据class信息判断是否符合生成对应的BeanDefinition的条件**(接口和抽象类不符合条件)**,如果符合则生成对应的BeanDefinition
在此处,程序员可以利用某些机制去修改BeanDefinition,实现扩展
根据BeanDefinition中的class信息反射生成bean实例
把生成的bean实例放入Spring容器中由此步骤可见,要想生成bean对象,首先需要有BeanDefinition。经过查阅资料发现是MapperScannerConfigurer.java类扫描Mapper,生产BeanDefinition,并把BeanClass设置成MapperFactoryBean,通过MapperFactoryBean生成的代理类。

三、源码查看步骤

1、创建MapperScannerConfigurer.java

springboot自动配置可以有多种方法创建MapperScannerConfigurer.java,我看的是若依框架中通过@MapperScan引入的方式。

2、@MapperScan注解

@MapperScan注解中@Import(MapperScannerRegistrar.class)引入了MapperScannerRegistrar
在这里插入图片描述

3、MapperScannerRegistrar执行registerBeanDefinitions方法

MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar(此接口一般配合@Import使用)接口所以会执行registerBeanDefinitions,registerBeanDefinitions方法中往BeanDefinitionRegistry中添加了MapperScannerConfigurer的类的描述,spring会根据BeanDefinition创建MapperScannerConfigurer。
在这里插入图片描述

4、MapperScannerConfigurer执行postProcessBeanDefinitionRegistry方法

MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor(此接口和ImportBeanDefinitionRegistrar区别 )接口会执行postProcessBeanDefinitionRegistry方法,postProcessBeanDefinitionRegistry这个方法会扫描配置的mapper接口路径下所有mapper接口类生成BeanDefinition。
在这里插入图片描述

5、执行doscan

MapperScannerConfigurer的父类ClassPathMapperScanner,爷类ClassPathBeanDefinitionScanner中doscan会根据配置mapper接口路径读取文件生成BeanDefinition类的集合。
在这里插入图片描述

6、设置beanClass

回到ClassPathMapperScanner执行processBeanDefinitions遍历所有beanDefinition集合把beanClass为MapperFactoryBean类型。
在这里插入图片描述

7、使用jdk生成代理类

MapperFactoryBean实现了FactoryBean,所以在Spring创建mapper类时会调用getObject方法,执行流程DefaultSqlSession中getMapper->configuration.getMapper->MapperRegistry.getMapper->MapperProxyFactory.newInstance(sqlSession),使用jdk动态代理生成mapperProxy。
在这里插入图片描述
knownMappers结合中的数据是初始化configuration的时候添加进去的,有兴趣的可以断点查看configuration初始化过程。在这里插入图片描述在这里插入图片描述

相关推荐

  1. spring boot 中动态注册mybatis mapper

    2024-07-19 14:38:01       55 阅读
  2. 如何Spring管理bean进行增强

    2024-07-19 14:38:01       34 阅读
  3. Spring如何管理事务的?

    2024-07-19 14:38:01       23 阅读
  4. Spring Boot实战:深入理解@Service与@Mapper注解

    2024-07-19 14:38:01       51 阅读
  5. 深入Spring Boot配置机制:如何高效管理应用配置

    2024-07-19 14:38:01       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 14:38:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 14:38:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 14:38:01       57 阅读
  4. Python语言-面向对象

    2024-07-19 14:38:01       68 阅读

热门阅读

  1. 【题解】StarryCoding P211 勇闯高塔

    2024-07-19 14:38:01       22 阅读
  2. Linux 之 设置环境变量

    2024-07-19 14:38:01       24 阅读
  3. 做一只勤劳的小蜜蜂

    2024-07-19 14:38:01       20 阅读
  4. 【ubuntu 网卡混杂模式设置】

    2024-07-19 14:38:01       17 阅读
  5. Hive函数之-posexplode()

    2024-07-19 14:38:01       14 阅读
  6. C语言 杂项笔记

    2024-07-19 14:38:01       18 阅读
  7. https和http区别

    2024-07-19 14:38:01       19 阅读
  8. Nginx配置ssl证书(https)

    2024-07-19 14:38:01       22 阅读
  9. VUE中setup()

    2024-07-19 14:38:01       20 阅读
  10. Perl语言入门学习指南

    2024-07-19 14:38:01       23 阅读
  11. LeetCode题(01,09,13,14,27,28,58)--《c++》

    2024-07-19 14:38:01       18 阅读