解决办法
- 把username这个变量名字更改一下,比如user/name等
- 在标签后面加一句代码 system-properties-mode=“NEVER”
<context:property-placeholder location="db.properties" system-properties-mode="NEVER"/>
出错原因
我们先来看一下代码
测试部分
public static void main(String[] args) throws SQLException {
ApplicationContext ac = new ClassPathXmlApplicationContext("conf/dataSource.xml");
DruidDataSource bean = ac.getBean("dataSource",DruidDataSource.class);
System.out.println(bean.geConnection());
}
XML部分
<!--第一种
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="Location" value="db.properties"></property>
</bean>
-->
<!-第二种-->
<context:property-placeholder location="db.properties" system-properties-mode="NEVER"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClass}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
配置文件部分
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///user?serverTimezone=UTC
username=root
password=zx201821
我们用第一种加载资源文件的方式 运行测试代码,正常,获取到的连接正常输出
com.mysql.cj.jdbc.ConnectionImpl@2892d68
然后我们用第二种方式,运行测试代码,报错了
Access denied for user ‘HP’ @‘localhost’ (using password: YES)
好,我们来说一下报错的原因
主要是system-properties-mode的值的问题
首先是一共有四个值
- SYSTEM_ PROPERTIES_ MODE FALLBACK模式:默认在指定的properties文件中找不到你要的属性,它还会在Java的System类属性中查找。
- SYSTEM_ PROPERTIES_ MODE_ NEVER模式:允许在properties文件中查找,允许去System类中查找。
- SYSTEM_ PROPERTIES_ MODE_ OVERRIDE模式:优先System类中查找,找不到再去properties文件中查找
- ENVIRONMENT:和OVERRIDE类似
然后我们看一下源码
第一种方式
public static final int SYSTEM_PROPERTIES_MODE_NEVER = 0;
public static final int SYSTEM_PROPERTIES_MODE_FALLBACK = 1;
public static final int SYSTEM_PROPERTIES_MODE_OVERRIDE = 2;
private static final Constants constants = new Constants(PropertyPlaceholderConfigurer.class);
private int systemPropertiesMode = 1;
system-properties-mode值为FALLBACK,根据上面的分析,他会先去配置文件中找,找到之后就不会再去系统里面寻找,不会覆盖,也不会报错
第二种方式
<xsd:attribute name="system-properties-mode" default="ENVIRONMENT">
system-properties-mode值为ENVIRONMENT,会覆盖,会先找系统中的username,找到了HP,也就不会去再去配置文件中找,故覆盖了root,所以报错
我们可以验证一下
我们在测试代码中输出username
public static void main(String[] args) throws SQLException {
ApplicationContext ac = new ClassPathXmlApplicationContext("conf/dataSource.xml");
DruidDataSource bean = ac.getBean("dataSource",DruidDataSource.class);
System.out.println(bean.geUsename());
}
第一种方式输出root
第二种在不修改的情况下输出为HP,修改过后输出为root
这也就验证了我们的分析
这就是我对这个错误的所有分析,有问题可以直接在评论区发表意见