美文网首页
Spring加载MyBatis过程

Spring加载MyBatis过程

作者: 萝灏 | 来源:发表于2018-11-30 11:48 被阅读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>

    从配置中,我们可以看出,这里做了两步操作:

  1. 构建SqlSessionFactory
  2. 把Mappers注入到Spring容器管理

  3. 构建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的过程。

    相关文章

      网友评论

          本文标题:Spring加载MyBatis过程

          本文链接:https://www.haomeiwen.com/subject/glbxcqtx.html