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反正是信了。