当前位置:   article > 正文

Mybatis与Spring集成源码研究之MapperScannerConfigurer_mybatis整合spring源码分析 mapperscannerconfigurer

mybatis整合spring源码分析 mapperscannerconfigurer

版本为mybatis-spring-1.2.2.jar ; 这个类主要是针对 package的

2017/11/5 修改格式!

1. 使用

典型配置如下:

<!-- 从库数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <!-- 基本属性 url、user、password -->
    <property name="driverClassName" value="${slave.jdbc.driver}"/>
    <property name="url" value="${slave.jdbc.url}"/>
    <property name="username" value="${slave.jdbc.username}"/>
    <property name="password" value="${slave.jdbc.password}"/>
    <!-- 配置初始化大小、最小、最大 -->
    <property name="initialSize" value="1"/>
    <property name="minIdle" value="1"/>
    <property name="maxActive" value="20"/>
    <!-- 配置获取连接等待超时的时间 -->
    <property name="maxWait" value="60000"/>
    <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
    <property name="timeBetweenEvictionRunsMillis" value="60000"/>
    <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
    <property name="minEvictableIdleTimeMillis" value="300000"/>
    <!-- 校验语句 -->
    <property name="validationQuery" value="SELECT 1"/>
    <property name="testWhileIdle" value="true"/>
    <property name="testOnBorrow" value="false"/>
    <property name="testOnReturn" value="false"/>
    <!-- 配置监控统计拦截的filters -->
    <property name="filters" value="stat"/>
</bean>

<!-- 为Mybatis创建SqlSessionFactory,同时指定数据源 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath*:com/zheng/upms/dao/mapper/*Mapper.xml"/>
</bean>

<!-- Mapper接口所在包名,Spring会自动查找其下的Mapper -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 指定扫描的package name ; 可以使用Ant模式通配符匹配 -->
    <property name="basePackage" value="**.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

2. 继承链

继承链如下:
MapperScannerConfigurer继承链
可以看到MapperScannerConfigurer类实现了Spring中的
1. InitializingBean接口
2. BeanDefinitionRegistryPostProcessor接口(此接口又继承自BeanFactoryPostProcessor接口)

所以以下三个方法必将被Spring框架回调
1. afterPropertiesSet方法
2. postProcessBeanDefinitionRegistry方法 //主要的实现逻辑处
3. postProcessBeanFactory方法 // 空实现

// InitializingBean接口定义的方法
@Override
public void afterPropertiesSet() throws Exception {
    // 必要参数的验证
    notNull(this.basePackage, "Property 'basePackage' is required");
}

// BeanDefinitionRegistryPostProcessor 接口定义的方法
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    // 处理占位符的问题
    if (this.processPropertyPlaceHolders) {
      processPropertyPlaceHolders();
    }

    // 构造一个ClassPathMapperScanner来完成这些'脏活累活'
    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();
    // 这里就可以看出为啥basePackage属性可以使用 ,; \t\n 分割了
    // String CONFIG_LOCATION_DELIMITERS = ",; \t\n";
    scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3. 细节

  1. 注意其中用到的主要类型ClassPathMapperScanner覆写了基类ClassPathBeanDefinitionScannerdoScan方法.
  2. 工具类SqlSessionUtils, 可以考虑熟悉下API, 避免重复造轮子.

4. 时机

观察其实现的接口很容易注意到这样一个问题,就是接口方法被回调的时机

MapperScannerConfigurer这个类中,我们可以看到:
1. 使用InitializingBean接口来进行必要参数的验证. 在先
2. 使用BeanDefinitionRegistryPostProcessor接口来进行实际逻辑的执行. 在后
3. 所以心中了然这两个接口在Spring中调用时机的先后顺序很有必要.
4. 以上内容于2017/3/31 0:10:31 完成初版. 直到现在才发布.

5. 总结

  1. 优秀框架的基本原则之一的”可配置必须可编程”, Mybatis完全做到了这一点.
  2. 依托于Spring强大的可扩展性, 只借助少量的类协同工作就完成了Spring和Mybaits的集成.
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/892553
推荐阅读
相关标签
  

闽ICP备14008679号