Spring加载MyBatis过程
2018-11-30 本文已影响0人
萝灏
先来看一下,Mybatis在Spring中是如何进行配置的。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="masterDataSource" /> <property name="configLocation" value="classpath:mybatis/sqlMapcfg.xml" /> <property name="mapperLocations" value="classpath*:mybatis/mapper/*mapper.xml"></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.luohao.candy.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /></bean>
从配置中,我们可以看出,这里做了两步操作:
构建SqlSessionFactory
1.SqlSessionFactoryBean实现了InitializingBean
接口,在Bean初始化的过程中会调用afterPropertiesSet()
方法。
public void afterPropertiesSet()throws Exception { notNull(dataSource, "Property 'dataSource' is required"); notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required"); this.sqlSessionFactory = buildSqlSessionFactory();}
在该方法中, 通过buildSqlSessionFactory()
来完成sqlSessionFactory的引用。在上面的方法中主要进行的操作是:整理加载配置信息Configuration,使用这些配置通过SqlSessionFactoryBuilder创建SqlSessionFactory,在最后调用了sqlSessionFactoryBuilder.build()。
把Mappers注入到Spring容器管理
在debug代码的时候我们会发现,dao的接口被注入在Spring中的Bean都是MapperFactoryBean
类型的,对于FactoryBean,我们通过getObject()
方法来获得实体。
public T getObject()throws Exception {return getSqlSession().getMapper(this.mapperInterface);}
再来看一下,这些MapperFactoryBean是怎样被注入到Spring中的。在xml的配置中,我们配置了一个MapperScannerConfigurer
的Bean,这个Bean实现了BeanDefinitionRegistryPostProcessor
接口,此接口继承了BeanFactoryPostProcessor
,在初始化一个Bean成BeanDefinition之后会对BeanDefinition进行拦截,来自定义的进行Bean的注册,代码如下。
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)throws BeansException {if (this.processPropertyPlaceHolders) {processPropertyPlaceHolders();}ClassPathMapperScanner scanner =new ClassPathMapperScanner(registry); scanner.setAddToConfig(this.addToConfig); scanner.setAnnotationClass(this.annotationClass); scanner.setMarkerInterface(this.markerInterface); scanner.setSqlSessionFactory(this.sqlSessionFactory); scanner.setSqlSessionTemplate(this.sqlSessionTemplate); scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName); scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName); scanner.setResourceLoader(this.applicationContext); scanner.setBeanNameGenerator(this.nameGenerator);scanner.registerFilters();scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));}
这样会根据你配置的包路径来寻找资源,然后把符合条件的接口注册成MapperFactoryBean,并且将接口类型进行设置。
definition.getPropertyValues().add("mapperInterface", definition.getBeanClassName());
以上就是Spring如何注入Dao并且获取Mapper的过程。