spring+mybatis加载属性文件设置数据源失败原因及解决方案

spring3 + mybatis 中,使用:

<!-- 属性文件配置 -->
<context:property-placeholder location="classpath:config.properties"/>

加载属性文件,然后在spring-database中使用属性文件值时失败:

<!-- JNDI数据源 -->
 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
 <property name="defaultObject" ref="noJndiDataSource" />
 <property name="jndiName" value="${jndiDS.jndiName}" />
 </bean>
 <!-- 直接数据源 -->
 <bean id="noJndiDataSource" class="${noJndiDS.class}">
 <property name="driverClassName" value="${noJndiDS.driverClassName}" />
 <property name="url" value="${noJndiDS.url}"/>
 <property name="username" value="${noJndiDS.username}"/>
 <property name="password" value="${noJndiDS.password}"/>
 </bean>

原因是,mybatis配置mapper使用的数据源的时候,使用的是:

<!--myBatis的数据库映射扫描器:扫描com.tonghui下的,注解为Repository的接口-->
 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
 <property name="basePackage" value="com.tonghui.spirit.user" />
 <property name="sqlSessionFactory" ref="sqlSessionFactory" />
 <property name="annotationClass" value="org.springframework.stereotype.Repository" />
 </bean>

其中,sqlSessionFactory 是数据源的工厂类引用,这样初始化mybatis时,属性文件的值还没被替换,就开始构造这个sqlSessionFactory类了,所以导致属性值加载失败

修改办法:
升级spring到3.1.1+版本,升级mybatis-spring到1.1.1+版本,把上述配置改为:

<!--myBatis的数据库映射扫描器:扫描com.tonghui下的,注解为Repository的接口-->
 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
 <property name="basePackage" value="com.tonghui.spirit.user" />
 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
 <property name="annotationClass" value="org.springframework.stereotype.Repository" />
 </bean>

即可,即sqlSessionFactory属性改为sqlSessionFactoryBeanName,ref的bean直接改为字符串的value, 这样没有直接注入sqlSessionFactory,而是等spring初始化完成后,再构造该类。