6. 和Spring集成

2020-04-26  本文已影响0人  lsh的学习笔记
InputStream inputStream = Resources.getResourceAsStream(resource);
// 1. 创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 创建会话
SqlSession session = sqlSessionFactory.openSession(); 
// 3. 使用Mapper
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlogById(1);

1. 创建会话工厂

mybatis-spring这个包里面提供了一个工厂类SqlSessionFactoryBean,这个工厂类实现了spring的扩展点FactoryBean,InitializingBean

由于实现了FactoryBean 接口,所以初始化的时候,会调用 getObject() 方法,里面又调用了 InitializingBean 接口的 afterPropertiesSet()方法,这里面调用了buildSqlSessionFactory()方法,来创建会话工厂。

SqlSessionFactoryBean#getObject SqlSessionFactoryBean#afterPropertiesSet

2. 创建会话并获取Mapper

mybatis-spring这个包还提供了一个类 MapperScannerConfigurer,这个类实现了BeanDefinitionRegistryPostProcessor接口,这个接口有一个方法postProcessBeanDefinitionRegistry()方法,也是spring的一个扩展点,主要是在注册Bean定义的之后调用,以修改、增加、删除Bean定义。这里主要用来增加Bean定义,也就是扫描Mapper,但是这里扫描后注册的不是Mapper接口的实现类,而是一个工厂MapperFactoryBean,这个工厂实现了FactoryBean

MapperScannerConfigurer#postProcessBeanDefinitionRegistry ClassPathBeanDefinitionScanner#scan ClassPathMapperScanner#doScan ClassPathMapperScanner#processBeanDefinitions

然后在创建Service类的时候,需要注入 Mapper 属性,此时需要从容器中getBean(),而容器中注册的是MapperFactoryBean,就会调用 getObject()方法,这里面创建了会话,并从会话中获取到了Mapper。注意这里创建的会话不是DefaultSqlSession,而是mybatis-spring包里面的 SqlSessionTemplate

MapperFactoryBean#getObject SqlSessionDaoSupport#getSqlSession
上一篇下一篇

猜你喜欢

热点阅读