首页 › 程序设计 › java

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

泡在网上的日子 / 文 发表于2013-06-22 00:07 次阅读 spring

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

收藏 赞 (0) 踩 (0)
上一篇:Spring ThreadLocal 基础知识
Spring通过各种模板类降低了开发者使用各种数据持久技术的难度,这些模板类都是线程安全的。但是这些资源本身却是非线程安全的。根据传统的经验,如果某个对象是非线程安全的话,在多线程的环境下,对于对象的访问都必须采用同步机制,但是模板类并没有采用
下一篇:SpringMVC之类型转换Converter
1.2 前言 在以往我们需要 SpringMVC 为我们自动进行类型转换的时候都是用的 PropertyEditor 。通过 PropertyEditor 的 setAsText() 方法我们可以实现字符串向特定类型的转换。但是这里有一个限制是它只支持从 String 类型转为其他类型。在 Spring3 中引入了