spring XML方式整合第三方框架

Spring整合MyBatis的原理剖析

整合包里提供了一个SqlSessionFactoryBean和一个扫描Mapper的配置对象,SqlSessionFactoryBean被实例化,就开始扫描Mapper并通过动态代理产生Mapper的实现类存储到Srping容器,有相关四个类

SqlSessionFactory需要进行配置,用于提供SqlSessionFactoryBean

源码: SqlSessionFactory   实现了FactoryBean接口,也就有了getObject方法,最重要的作用就是产生SqlSessionFactory对象注入到spring容器

配置文件中实例化setDataSource

实现了InitializingBean接口

然后调用afterPropertiesSet方法

this.sqlSessionFactory = this.buildSqlSessionFactory()

buildSqlSessionFactory返回

sqlSessionFactoryBuilder.build(targetConfiguration)

targetConfiguration就是配置文件

然后调用SqlSessionFactory的getObject方法 返回sqlSessionFactory,于是当前spring容器中已经存在sqlSessionFactory的bean对象,谁用就去拿

谁用到了SqlSessionFactoryBean就去调用getObject,然后返回

MapperScannerConifigruer: 需要进行配置,用于扫描指定mapper注册BeanDefinition

 

代码继承体系

实现了BeanDefinitionRegistryPostProcessor接口,再存储到BeanDefinitionMap后,调用其工厂bean处理器,

BeanDefinitionMap的postProcessBeanDefinitionRegistry方法
 
ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);

这里的scanner.scan是ClassPathMapperScanner的父类的scan,其本身没有scan方法

scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ",; \t\n"));

调用ClassPathMapperScanner的父类的scan

scan方法里面再调用其儿子doscan方法,这里儿子没有重写父亲的scan方法,进入到scan的类型还行儿子的类型,调用的doScan还是儿子的doScan

儿子的doScan再调用父类的doScan

父类的doScan

这里的beanClass是UserMapper接口对象,如果是class类对象可以通过反射创建对象

这里把UserMapper等beanDefinition都注册到BeanDefinitionMap,然后返回给儿子的beanDefinitions

 这里beanDefinitions已经有长度了,并且super.doScan扫描的是com.edu.mapper这个包

然后调用ClassPathMapperScanner的

processBeanDefinitions方法,这个方法在ClassPathMapperScanner

这个方法主要看setBeanClass,把原来的beanClass换成mapperFactoryBeanClass

mapperFactoryBeanClass调用object方法

MapperFactoryBean继承了FactoryBean

MapperFactoryBean调用object方法,返回的Mapper对象,不是spring干的,是mybatis底层干的

再往后~~~~~~~~~~~~~

setAutowireMode(2)自动注入,这里会发现beanClass改变,变成了MapperFactoryBean

MapperFactoryBean:Mapper的FactoryBean,获取指定Mapper时调用Object方法

ClassPathMapperScanner:definition.setAutowireMode(2)修改了自动注入状态,所以MapperFactoryBean中的setSqlSessFactory会自动注入进去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值