Mybatis-spring 源码分析之 Mapper Bean

MapperScannerConfigurer 实现BeanDefinitionRegistryPostProcessor 而该类有继承了BeanFactoryPostProcessor 即Spring的拓展点之一在实例化之前可以做一些事情,比如这里的扫描dao的描述对象BeanDefinition注册到工厂中,剩下的活就交由Spring来创建Dao对象了。 而然很遗憾BeanFactoryPostProcessor在此只是空实现,完成扫描功能还是使用的BeanDefinitionRegistryPostProcessor的方法实现扫描功能!

SqlSessionFactory 是 Mybatis 应用的核心类,它是创建 SqlSesison 的工厂类,而 SqlSesison 是我们用 Mybatis 与数据库会话的 顶层 API 类,所有与数据库会话都需要创建 SqlSesison。

SqlSessionFactoryBean 是 SqlSessionFactory 的具体实现,他实现了 FactoryBean 和 InitializingBean 接口:

FactoryBean:BeanFactory 定义了 Ioc 容器的最基本形式,并提供了 Ioc 容器应遵守的的最基本的接口,也就是 Spring Ioc 所遵守的最底层和最基本的编程规范,一旦某个 Bean 实现了该接口,Spring 的getBean方法其实是调用了 Bean 的 getObject() 方法,即是获取 Bean 实例是通过 getObject() 获取的,这规范很重要,后面会重点围绕着点来讲。

InitializingBean:某个 Bean 若实现了 该接口,那么 Spring 实例该 Bean 时首先会调用 afterPropertiesSet() 方法对 Bean 进行初始化动作。

BeanDefinition:它是 Spring 中用于包装 Bean 的数据结构,一个 BeanDefinition 描述了一个 bean 的实例,包括它的类名,具体的 class 对象等属性值。

 @Import 注解,它的作用是导入资源,如果导入的是一个普通类,spring 还会将其注册成一个普通的 Bean。

MapperScan 注解通过 @Import 注入了 Mapper 扫描注册类,通过该扫描类扫描 Mapper 目录,并将 Mapper 注册成一个 Bean。

MapperScannerRegistrar 类实现了 ImportBeanDefinitionRegistrar ,该 interface 是 Spring 动态注册 Bean 的方法,所有实现了该接口的类都会被 ConfigurationClassPostProcessor 处理。

总结一下 Mapper 的创建过程:

  1. IOC 通过注解扫描指定包名,在初始化的时候调用 @MapperScan 注解中指定的类最终执行 doScan 方法,将所有的 Mapper 接口的 Bean 定义都改成 FactoryBean 的子类 MapperFactoryBean,并将该 SqlSessionFactory 和 SqlSessionTemplate 添加到该类中。

  2. Spring IOC 在实例化该 Bean 的时候,需要传入接口类型,并将 SqlSessionFactory 和 SqlSessionTemplate 注入到该 Bean 中。并调用 configuration 的 addMapper 方法,解析配置文件。

  3. 当调用 MapperFactoryBean 的 getObject 方法的时候,事实上是调用 SqSession 的 getMapper 方法,而这个方法会返回一个动态代理对象。所有对这个对象的方法调用都是底层的 SqlSession 的方法。


 

猜你喜欢

转载自blog.csdn.net/m0_37039331/article/details/88046620