[Spring]属性加载优先级

    Spring中,XML配置文件里面,各个属性源的加载顺序有一定先后顺序。

    我们在使用spring时,一些参数配置通常不会直接写在spring的bean的XML配置文件里面。在我们使用${参数名},时,如果系统环境变量中有同名的name时,可能会被Spring优先使用。

    比如Windows,系统环境变量中通常会有USERNAME,如果我们在给数据库驱动配置相关参数时,把数据库的用户名变量的变量名定义成 username ,会导致其被系统环境变量覆盖:

     我们写一个测试类,通过断点查看我们插入进去的值:

    可以看到我们的数据库用户名没有被正确赋值。最直接的解决方法更改properties文件中的变量名,我们先看属性加载优先级。

属性加载优先级

1.命令行参数,比如–server.port=8080。

2.JVM系统属性。

3.系统环境属性。

4.其他通过<context>系列标签引入的自定义配置文件(例如.properties和yml,而其中properties又先于yml)

4.通过@Configuration注解类上的@PropertySource注解引入的配置文件

解决优先级导致的属性冲突

    主要有以下两种方法:

第一种:也是最直接的方法,更改我们使用的变量名,让其不再与其他环境变量重名。像username与系统环境变量重名,我们将其更改为 name 或者 database.username 。

第二种:显示指定属性源优先级。在 Spring 配置中,强制优先使用 properties 文件中的值,忽略环境变量。在 <context:property-placeholder> 中添加 system-properties-mode="NEVER"即可:

<context:property-placeholder 
    location="classpath:your.properties"
    system-properties-mode="NEVER"
/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值