Spring属性加载优先级
目录
[Spring]属性加载优先级
Spring中,XML配置文件里面,各个属性源的加载顺序有一定先后顺序。
我们在使用spring时,一些参数配置通常不会直接写在spring的bean的XML配置文件里面。在我们使用${参数名},时,如果系统环境变量中有同名的name时,可能会被Spring优先使用。
比如Windows,系统环境变量中通常会有USERNAME,如果我们在给数据库驱动配置相关参数时,把数据库的用户名变量的变量名定义成 username ,会导致其被系统环境变量覆盖:
我们写一个测试类,通过断点查看我们插入进去的值:
可以看到我们的数据库用户名没有被正确赋值。最直接的解决方法更改properties文件中的变量名,我们先看属性加载优先级。
属性加载优先级
1.命令行参数,比如–server.port=8080。
2.JVM系统属性。
3.系统环境属性。
4.其他通过
4.通过@Configuration注解类上的@PropertySource注解引入的配置文件
解决优先级导致的属性冲突
主要有以下两种方法:
第一种:也是最直接的方法,更改我们使用的变量名,让其不再与其他环境变量重名。像username与系统环境变量重名,我们将其更改为 name 或者 database.username 。
第二种:显示指定属性源优先级。在 Spring 配置中,强制优先使用 properties 文件中的值,忽略环境变量。在 中添加 system-properties-mode=“NEVER"即可:
<context:property-placeholder
location="classpath:your.properties"
system-properties-mode="NEVER"
/>