亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字( 二 )


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

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

文章插图
 
d、调用doScan方法扫描mapper
亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字

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

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

文章插图
 
调用父类的doScan后,会扫描到basePackage指定包下面的mapper接口,并封装成BeanDefinitionHolder的集合 。BeanDefinitionHolder包含了BeanDefinition,同时包括BeanDefinition的名称和别名
e、使用processBeanDefinitions对扫描出来的mapper的BeanDefinition进行一些修改
亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字

文章插图
 
processBeanDefinitions主要做了一下几个处理:
亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字

文章插图
 

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

文章插图
 
上图处理中,最重要的就两个,一是更改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)来完成 。下面是这个类的依赖关系图 。
亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字

文章插图
 
在图中,MapperFactoryBean集成的DaoSupport类实现了InitializingBean接口,那么spring在完成属性注入后,会调DaoSupport的afterPropertiesSet方法 。在该afterPropertiesSet中调用了checkDaoConfig方法,由于MapperFactoryBean重写了checkDaoConfig方法,所以在Bean属性注入完成后,会调用MapperFactoryBean的checkDaoConfig方法 。
亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字

文章插图
 

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

文章插图
 
a、关键属性注入
下面来看看MapperFactoryBean的checkDaoConfig方法都做了些什么 。但是看之前,我们先简单了解下该Bean中注入的主要属性,这些属性在checkDaoConfig方法中用到了,如果不讲清楚的话,会很疑惑这些属性是从哪里来的,了解了才能对tk-mybatis与Spring的集成更加的清楚 。
mapperInterface的注入:
亲自啃了一周,终于把Mybatis源码理清,以后简历请写精通二字

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

文章插图
 
那么被注入的SqlSessionFactory和SqlSessionTemplate是如何被创建的呢,看下图,玄机就在


推荐阅读