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初始化完成后,再构造该类。