beans.xml中可以使用類似EL表達式的方式來擷取properties檔案中的内容:
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<!-- 連接配接池啟動時的初始值 -->
<property name="initialSize" value="${initialSize}"/>
<!-- 連接配接池的最大值 -->
<property name="maxActive" value="${maxActive}"/>
<!-- 最大空閑值.當經過一個高峰時間後,連接配接池可以慢慢将已經用不到的連接配接慢慢釋放一部分,一直減少到maxIdle為止 -->
<property name="maxIdle" value="${maxIdle}"/>
<!-- 最小空閑值.當空閑的連接配接數少于閥值時,連接配接池就會預申請去一些連接配接,以免洪峰來時來不及申請 -->
<property name="minIdle" value="${minIdle}"/>
</bean>
jdbc.properties檔案中:
driverClassName=org.gjt.mm.mysql.Driver
url=jdbc\:mysql\://localhost:3306/ahau?useUnicode\=true&characterEncoding\=UTF-8
username=root
password=root
initialSize=1
maxActive=500
maxIdle=2
minIdle=1
這樣寫看上去沒有問題,我看黎活明老師關于spring2.5的視訊中這樣寫的确沒有問題,可是我在spring4.0.2中這樣寫就不行了。
所有的參數值都擷取到了,就是username擷取不到。運作時報如下錯:
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access
denied for user 'cjb'@'localhost' (using password: YES))
可以看到很明顯說資料庫名錯了,我把${username}直接換成root就可以了。顯然這沒有解決問題。
我實在不明白這個cjb是從哪兒冒出來的,但肯定是跟某些地方沖突了,我也實在不知道在哪兒起的沖突。我的Mysql資料庫确實有一個cjb使用者。可是我在這裡出現了的确很詭異。
打開spring-framework-4.0.2.RELEASE-dist\spring-framework-4.0.2.RELEASE\docs\spring-framework-reference\htmlsingle\index.html,搜尋 "${" 來到這裡(如圖):
可以看到官方文檔不是直接寫username的,他知道會出問題是以在配置檔案中才寫成jdbc.username。文檔上說了,是它檢查了其他檔案裡的東西。可是我不明白我明明指明了jdbc.properties檔案了,而且它也找到了,為什麼就這個username它要換掉呢。
是以:
jdbc.properties檔案中要寫成
jdbc.username=root
spring配置檔案裡引用的時候寫成${jdbc.username}。
其他屬性最好也帶上字首。
不管它了,按官方文檔的示例來寫,問題果然解決。。。以前聽老師說遇到問題了一定要去查官方文檔,而且是英文版的,一直将信将疑,至于你信不信wo反正是信了。