文章插图
【亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字】

文章插图
d、调用doScan方法扫描mapper

文章插图
ClassPathMapperScanner这个扫描器继承了
ClassPathBeanDefinitionScanner接口,并重写了doScan方法和isCandidateComponent
doScan:里面会直接复用父类自带的doScan方法,因为这就是spring扫描包中的bean的方法,在该方法中,会先使用上一步调动registerFilters方法注册的过滤器判断扫描出来的类是否符合条件(excludefilter和includefilter判断),然后再利用重写后的isCandidateComponent方法进一步判断是否符合条件(默认接口类是不符合Spring扫描条件的,这里通过重写该方法,判断扫描出来的类是不是接口且该类metadata中的encloseclass值为null,是的话就符合扫描条件),两个判断都通过,则认为是扫描出来的mapper接口类 。

文章插图
重写的isCandidateComponent方法

文章插图
调用父类的doScan后,会扫描到basePackage指定包下面的mapper接口,并封装成BeanDefinitionHolder的集合 。BeanDefinitionHolder包含了BeanDefinition,同时包括BeanDefinition的名称和别名
e、使用processBeanDefinitions对扫描出来的mapper的BeanDefinition进行一些修改

文章插图
processBeanDefinitions主要做了一下几个处理:

文章插图

文章插图
上图处理中,最重要的就两个,一是更改BeanClass, 二是设置autowired-mode = by type,使得SqlSeesionTemplate可以作为MapperFactoryBean的属性注入进来(autowired-mode常见的有三种,AUTOWIRE_NO、AUTOWIRE_BY_NAME、AUTOWIRE_BY_TYPE,是基于xml的Spring配置时,用来定义Bean的注入方式的 。利用@Component等注解创建的Bean默认值都是AUTOWIRE_NO,表示无需进行属性的注入,有@autowire等注解时按注解的方式完成属性注入,AUTOWIRE_BY_NAME和AUTOWIRE_BY_TYPE分别表示按名称和按类型进行参数的注入 。如果该属性为这两个值,Spring容器在创建Bean的时候会对Bean的属性自动完成注入,注入时会扫描set方法,调用set方法并对set方法的参数注入,从而实现属性的注入 。注意,这里因为是扫描出来的Mapper类的Bean对象且没有@Component等注解,所以就通过修改autowired-mode的方式,通知Spring容器,对该Bean属性进行注入) 。
好了,扫描Mapper的工作到此为止,接下来就是Mapper接口的实例化了 。
2、Mapper 接口Bean的实例化:上面讲到Mapper接口的BeanDefinition的BeanClass被改成了tk.mybatis中的MapperFactoryBean 。那么实例化的工作主要会由这个类(实例化出另外一个Bean来替代原始的Mapper接口的Bean)来完成 。下面是这个类的依赖关系图 。

文章插图
在图中,MapperFactoryBean集成的DaoSupport类实现了InitializingBean接口,那么spring在完成属性注入后,会调DaoSupport的afterPropertiesSet方法 。在该afterPropertiesSet中调用了checkDaoConfig方法,由于MapperFactoryBean重写了checkDaoConfig方法,所以在Bean属性注入完成后,会调用MapperFactoryBean的checkDaoConfig方法 。

文章插图

文章插图
a、关键属性注入
下面来看看MapperFactoryBean的checkDaoConfig方法都做了些什么 。但是看之前,我们先简单了解下该Bean中注入的主要属性,这些属性在checkDaoConfig方法中用到了,如果不讲清楚的话,会很疑惑这些属性是从哪里来的,了解了才能对tk-mybatis与Spring的集成更加的清楚 。
mapperInterface的注入:

文章插图
SqlSession的注入

文章插图
那么被注入的SqlSessionFactory和SqlSessionTemplate是如何被创建的呢,看下图,玄机就在
推荐阅读
- 病毒都去哪了,为什么现在的电脑很少中毒
- 我也没想到,Java开发 API接口可以不用写 Controller了
- 许褚被张飞刺于马下视频,为何许褚却平不了张飞
- 李重茂当了多久的皇帝,李重茂与李隆基的关系
- 关羽败走麦城是输给了谁,关羽败走麦城输给了哪位武将
- 汉献帝刘协是一个怎样的人,汉献帝知道刘备称帝了吗
- 三国最后被谁统治了,三国最后被谁统治了
- Java中的封装、继承和多态,你真的都懂了吗
- 详读!别再说不知道增值电信业务许可证是什么了
- 什么茶叶喝了可以减肥,喝什么茶减肥快又健康
