個人項目中用到了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