1.首先是,引用mybatis的入口
mybatis接入分析
2.看一下MapperScannerConfigurer类的继承关系,主要看接口BeanDefinitionRegistryPostProcessor
这个接口有一个方法postProcessBeanDefinitionRegistry,下面先看看这个方法是在哪个地方调用的。
mybatis接入分析

大名鼎鼎的BeanFactoryPostProcessor(BFPP)出现了~~~~~~~,看一下它的应用,公司很多组件都有它的身影。

它还有一个孪生兄弟叫BeanPostProcessor(BPP),后面wiki在介绍这哥俩
mybatis接入分析

3.这个接口方法是在容器启动方法refresh中调用的。
mybatis接入分析
mybatis接入分析

4.然后来看看MapperScannerConfigurer.postProcessBeanDefinitionRegistry方法里面都实现了什么
mybatis接入分析

5.ClassPathMapperScanner继承了ClassPathBeanDefinitionScanner这个类,并且重写了doScan方法(除了调用父类的doScan方法外,又增加了processBeanDefinitions)
父类的doScan方法,根据【】这个basePackage,生成BeanDefinitions
processBeanDefinitions这个方法就是把父类生成的BeanDefinitions,在修改一下。完成对MapperFactoryBean的BeanDefinitions的包装。
包装后,比如调用mapping.insertDB方法是即调用MapperFactoryBean.insertDB。
包装内容如下等等:
definition.setBeanClass(this.mapperFactoryBean.getClass());

definition.getPropertyValues().add(“sqlSessionFactory”, this.sqlSessionFactory);

PS:后面我会单独讲讲ClassPathBeanDefinitionScanner这个类,用的也很广泛,包括对@Component,@Service等注解的解析都会用到。关于ClassPathBeanDefinitionScanner的wiki
mybatis接入分析

关于GenericBeanDefinition如何能够实例化一个bean,请参照这个wiki

6.首先看看MapperFactoryBean的继承关系,实现了FactoryBean这个接口,这个接口是用来构造复杂对象的,
在获得对象的时候,实际是调用getObject方法
mybatis接入分析
mybatis接入分析

最终调用下面的方法,看mapperProxyFactory.newInstance(sqlSession)
mybatis接入分析
最终还是通过jdk的动态代理实现,mapperProxy实现的InvocationHandler接口
mybatis接入分析
看handler的invoke方法,最终调用的时候就是执行 MapperProxy.invoke的方法 (这个就是最终调用了~~~~~~~~~~)
mybatis接入分析
mybatis接入分析
另外公司的zebra数据库中间件和上面写的都一样。

ZebraMapperFactoryBean从MapperFactoryBean复制而来。

ZebraMapperScannerConfigurer从MapperScannerConfigurer复制而来

唯一的区别在ZebraMapperFactoryBean这个getObject方法,多了 3行和4行。 是2次代理了一下

其目的有两个: 一个是异步执行 一个是为了Cat打点。可以从AsyncMapperProxy看出来

代码块
public T getObject() throws Exception {
T mapper = this.getSqlSession().getMapper(this.mapperInterface);
AsyncMapperProxy asyncMapperProxy = new AsyncMapperProxy(mapper, this.mapperInterface);
return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, asyncMapperProxy);
}

相关文章:

  • 2021-04-20
  • 2022-01-14
  • 2021-10-17
  • 2021-07-02
  • 2021-12-10
  • 2021-04-28
  • 2021-09-03
  • 2021-12-26
猜你喜欢
  • 2021-04-04
  • 2021-05-29
  • 2021-07-07
  • 2021-08-26
  • 2021-08-19
  • 2022-12-23
  • 2021-06-06
相关资源
相似解决方案