赞
踩
版本为mybatis-spring-1.2.2.jar ; 这个类主要是针对 package的
2017/11/5 修改格式!
典型配置如下:
<!-- 从库数据源 -->
<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>
继承链如下:
可以看到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));
}
ClassPathMapperScanner
覆写了基类ClassPathBeanDefinitionScanner
的doScan
方法.SqlSessionUtils
, 可以考虑熟悉下API, 避免重复造轮子.观察其实现的接口很容易注意到这样一个问题,就是接口方法被回调的时机。
在MapperScannerConfigurer
这个类中,我们可以看到:
1. 使用InitializingBean
接口来进行必要参数的验证. 在先
2. 使用BeanDefinitionRegistryPostProcessor
接口来进行实际逻辑的执行. 在后
3. 所以心中了然这两个接口在Spring中调用时机的先后顺序很有必要.
4. 以上内容于2017/3/31 0:10:31 完成初版. 直到现在才发布.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。