问题描述
基于 XML 方式编写 Spring 代码时,引入的 jdbc.properties 属性配置文件的 username 被神奇的替换为当前系统的用户名,例如属性配置文件里的 username 明明写的是 root,但代码运行显示 username 却是 Administrator,非常的诡异。
Spring 主配置文件中问题相关代码如下:
<context:property-placeholder location="jdbc.properties"/>
<bean id="dataSource" class="com.ltb.MyDataSource">
<property name="properties">
<props>
<prop key="driver">${driver}</prop>
<prop key="url">${url}</prop>
<prop key="username">${username}</prop>
<prop key="password">${password}</prop>
</props>
</property>
</bean>
jdbc.properties 属性配置文件代码如下:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123
原因分析
开启 Spring 启动的日志信息,发现日志中有这么一条信息:
2023-08-09 01:16:34 401 [main] DEBUG org.springframework.core.env.SystemEnvironmentPropertySource - PropertySource 'systemEnvironment' does not contain property 'username', but found equivalent 'USERNAME'
发现关键点,原来是 Spring 将系统环境变量中的 USERNAME 拿来用了,并没有用到我们属性配置文件里的配置。
解决方案
属性配置文件中的 key 尽量不要和系统环境变量重名,添加一些必要的前缀用来区分。修改上述 jdbc.properties 内容如下:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123