目录

Spring属性加载优先级

目录

[Spring]属性加载优先级

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

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

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

https://i-blog.csdnimg.cn/direct/7b2e2266e810477f9abcf6b1601926d7.png

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

https://i-blog.csdnimg.cn/direct/22bafdaeb40c458aa6e16de76eac294a.png

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

属性加载优先级

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

2.JVM系统属性。

3.系统环境属性。

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

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

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

主要有以下两种方法:

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

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

<context:property-placeholder 
    location="classpath:your.properties"
    system-properties-mode="NEVER"
/>