通過properties配置檔案配置資料來源,程式碼如下:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="order" value="3" /> <property name="ignoreUnresolvablePlaceholders" value="true" /> <property name="locations"> <list> <value>classpath:config/db.properties</value> <!-- 注意路徑寫法,上面寫法要加classpath,路徑前不能有/,此下面寫法properties檔案要在WEB-INF目錄下,路徑前要有/ <value>/WEB-INF/test.properties</value> --> </list> </property> </bean> <!-- 自定義資料來源 --> <bean id="dataSource" name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="driverClassName" value="${db.jdbc.driverClassName}" /> <property name="url" value="${db.jdbc.url}" /> <property name="username" value="${db.jdbc.username}" /> <property name="password" value="${db.jdbc.password}" /> <!-- 配置初始化大小、最大連線數量 --> <property name="initialSize" value="${db.initialSize}"/> <property name="maxActive" value="${db.maxActive}"/> <!-- 連線最大等待時間 --> <property name="maxWait" value="${db.maxWait}" /> <property name="poolPreparedStatements" value="true" /> <property name="defaultAutoCommit" value="true" /> <!-- 連線池最大、最小空閒 --> <property name="maxIdle" value="${db.maxIdle}" /> <property name="minIdle" value="${db.minIdle}" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}" /> <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}" /> <!-- 校驗語句 --> <property name="validationQuery" value="select 1 from dual"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="false"/> <!-- 配置監控統計攔截的filters --> <property name="filters" value="stat"/> </bean>
專案啟動報錯:
org.springframework.beans.TypeMismatchException。。。。
java.sql.SQLException: ${db.jdbc.driverClassName}
經查閱資料發現是此配置引起:
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xiaomu.**.dao" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
原因:
MapperScannerConfigurer自定義了bean的初始化介面,在其初始化時placeholder還未初始化,導致properties值還沒注入進來而報錯
解決:
MapperScannerConfigurer注入 sqlSessionFactory 的時候有兩種選擇一種是在spring配置的時候直接注入sqlSessionFactory物件,另一種是sqlSessionFactoryBeanName通過名字來注入bean。
故將<property name="sqlSessionFactory" ref="sqlSessionFactory" />改為<property name="sqlSessionFactoryBeanName" value="mybatisSqlSessionFactory" />即可,注意改過後value值不能使用原來的sqlSessionFactory名稱,因為是通過名稱注入,故使用sqlSessionFactory依然會報錯。
注:sqlSessionFactoryBeanName為非必須標籤,單資料來源時可以不用配置
說明:
MapperScannerConfigurer作用和mappers標籤作用類似,都是掃描mapper確定對映關係,mapper配置形式為:
<mappers> <!-- sql檔案配置方式一:指定檔案路徑位置,sql.xml檔案namespace可以直接用dao名稱,注意此時sql.xml檔案要在resource目錄下 --> <!-- <mapper resource="mybatis/sqlmap/user/brokerinfoMapper.xml"/> --> <!-- sql檔案配置方式二:sql檔案和dao介面放在同一個目錄下,只需要配置sql.xml檔案和介面所在包路徑 , 但是sql.xml的namespace要是dao介面的完整路徑--> <!-- <package name="com.test.web.dao"/> --> </mappers>
參考原文地址:https://www.cnblogs.com/LionheartCGJ/p/7886423.html