个人项目中用到了spring3.2.5+mybatis3.1.1+mybatis-spring1.2.1,我把数据库链接信息写在配置文件里,而后在spring配置文件中加上<context:property-placeholder location="file:D:\foxking\taobao.properties" /> 来引入,dataSource配置以下: java
程序一运行就报:java.lang.ClassNotFoundException: ${driverClass} ............等一大堆错误,spring 配置检查了N多遍,没发现问题,让我很郁闷。因而不停的百度、Google,不停的改配置、测试,问题依然没有解决。后来终于找到了解决方法。 spring
先说一下问题的缘由所在: sql
在spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 进行自动扫描的时候,设置了sqlSessionFactory 的话,可能会致使PropertyPlaceholderConfigurer失效,也就是用${jdbc.username}这样之类的表达式,将没法获取到properties文件里的内容。 致使这一缘由是由于,MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,会致使提早初始化一些类,这个时候,PropertyPlaceholderConfigurer还没来得及替换定义中的变量,致使把表达式看成字符串复制了。 但若是不设置sqlSessionFactory 属性的话,就必需要保证sessionFactory在spring中名称必定要是sqlSessionFactory ,不然就没法自动注入。又或者直接定义 MapperFactoryBean ,再或者放弃自动代理接口方式。 数据库
出问题的缘由找到了,如今再找方法解决问题,方法以下: session
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> mybatis
<property name="basePackage" value="com.xxxx.dao.mapper" /> app
<property name="sqlSessionFactoryBeanName" value="sf1" /> 测试
<!-- <property name="sqlSessionFactory" ref="sf1"></property> --> spa
</bean> .net
改用sqlSessionFactoryBeanName注入就没有问题(不要使用sqlSessionFactory属性注入,使用sqlSessionFactoryBeanName注入),由于这时不会当即初始化sqlSessionFactory,传入的只是名字,非bean,因此不会引起提早初始化问题。
本文参考自http://www.oschina.net/question/188964_32305?sort=default&p=1#answers