spring读取properties报错(system-properties-mode的值的问题)

解决办法

  1. 把username这个变量名字更改一下,比如user/name等
  2. 在标签后面加一句代码 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的值的问题
首先是一共有四个值

  1. SYSTEM_ PROPERTIES_ MODE FALLBACK模式:默认在指定的properties文件中找不到你要的属性,它还会在Java的System类属性中查找。
  2. SYSTEM_ PROPERTIES_ MODE_ NEVER模式:允许在properties文件中查找,允许去System类中查找。
  3. SYSTEM_ PROPERTIES_ MODE_ OVERRIDE模式:优先System类中查找,找不到再去properties文件中查找
  4. 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
这也就验证了我们的分析

这就是我对这个错误的所有分析,有问题可以直接在评论区发表意见

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值