整合入口 MybatisAutoConfiguration,registerBeanDefinition()s为扫描,sqlSessionFactory()为spring注入SqlSessionFactoryBean对象,其次注入SqlSessionTemplate对象,每个MapperFactoryBean又都持有SqlSessionTemplate,SqlSessionFactory中持有Configuration对象
扫描mapper接口作为Bean定义
扫描配置的mapper接口,并将这些mapper接口被beanDefinition置为MapperFactoryBean
org.mybatis.spring.mapper.ClassPathMapperScanner#processBeanDefinitions
解析mapper接口对应得xml文件
实例化每一个Mapper接口时,会在调用afterPropertiesSet方法,将mapper接口的代理工厂放入Configuration.MapperRegistry.knownMappers这个map对象中,然后将mapper接口对应的xml文件中sql语句解析放入Configuration.mappedStatements中
org.springframework.dao.support.DaoSupport#afterPropertiesSet
将Mapper的代理对象放入spring
实例化每个mapper对象时会调用MapperFactoryBean的getObject方法,在这其中又会将mapper的代理工厂MapperProxyFactory从knownMappers中取出,并调用其中newInstance方法创建出该mapper的代理对象MapperProxy,并将MapperProxy放入spring容器中
执行mapper中的接口方法
由于spring中存放的是mapper对象的代理对象,所以在执行时,便会执行MapperProxy中的invoke方法,cachedMapperMethod中会将mapper中的接口与mapper.xml中的sql进行映射,没有映射上就会报错,映射上了就进行缓存
然后执行其中的execute方法,然后便是执行SqlSession中的方法,由于spring要接管事物的管理,便对SqlSession做了一层代理
因此会先执行SqlSessionInterceptor中的invoke方法,看事物是否提交
以查询为例,执行sql会先从configuration.mappedStatements中取出sql申明,然后便是sql的具体执行流程