Spring 属性看起来如何 up/precedence 工作?
How does Spring properties look up/precedence work?
我已经为此苦苦挣扎了一段时间。我已经 google 并尝试了几种方法,但我发现的所有方法都无法解决我的问题。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" ref="propertiesLocations" />
<property name="searchSystemEnvironment" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
这就是我的 propertiesLocations。
<beans profile="">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
<beans profile="test">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
<value>classpath*:project-test.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
<beans profile="testing">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value> <!-- production properties -->
<value>classpath*:com/lala/project/**/test/configuration/*.properties <!-- test properties -->
</value>
<value>classpath*:project-testing.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
然后,在我的一个子项目中,我有 2 个属性文件,我的 "production" 属性在
src/main/resources/com/lala/project/subproject1/subprojectA/configuration/myProperties.properties
和我在
下的"test"属性
src/test/resources/com/lala/project/subproject1/subprojectA/test/configuration/myProperties.properties
显然,这些文件具有几乎相同的属性名称,但具有不同的值。
我想知道的是为什么我在 subprojectA 中的测试一直选择我的 "production" 属性而不是我的 "test" 属性?换句话说,为什么 spring 不获取我的 "test" 属性并覆盖我的 "production properties"?
我忘了说我不能简单地删除我的测试配置文件的 "production" 属性位置,因为我需要其他项目、子项目的生产属性。
尝试像这样更改您的测试属性路径:
file:src/test/resources/com/lala/project/configuration/core.properties
我只是发布我自己的答案以防万一有人遇到类似问题。
正如我正确理解的那样,属性文件位置的优先级向下。换句话说,底部的位置 has/takes 最优先。
但是,问题不在于查找优先级,而在于查找的方式。看起来好像 Spring 不喜欢这两行:
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
经过多次试验后我得出的结论是,由于 第二个正则表达式匹配的 routes/locations 也与第一个 匹配,它们被考虑在内第一行然后在第二行中不考虑(我在考虑查找过程,因为它从上到下逐行处理)。
所以我最后做的是改变我的测试属性的位置,比如
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
类似于
<value>classpath*:com/lala/project/**/configuration/test/*.properties
</value>
我已经为此苦苦挣扎了一段时间。我已经 google 并尝试了几种方法,但我发现的所有方法都无法解决我的问题。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" ref="propertiesLocations" />
<property name="searchSystemEnvironment" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
这就是我的 propertiesLocations。
<beans profile="">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
<beans profile="test">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
<value>classpath*:project-test.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
<beans profile="testing">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value> <!-- production properties -->
<value>classpath*:com/lala/project/**/test/configuration/*.properties <!-- test properties -->
</value>
<value>classpath*:project-testing.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
然后,在我的一个子项目中,我有 2 个属性文件,我的 "production" 属性在
src/main/resources/com/lala/project/subproject1/subprojectA/configuration/myProperties.properties
和我在
下的"test"属性src/test/resources/com/lala/project/subproject1/subprojectA/test/configuration/myProperties.properties
显然,这些文件具有几乎相同的属性名称,但具有不同的值。 我想知道的是为什么我在 subprojectA 中的测试一直选择我的 "production" 属性而不是我的 "test" 属性?换句话说,为什么 spring 不获取我的 "test" 属性并覆盖我的 "production properties"?
我忘了说我不能简单地删除我的测试配置文件的 "production" 属性位置,因为我需要其他项目、子项目的生产属性。
尝试像这样更改您的测试属性路径:
file:src/test/resources/com/lala/project/configuration/core.properties
我只是发布我自己的答案以防万一有人遇到类似问题。
正如我正确理解的那样,属性文件位置的优先级向下。换句话说,底部的位置 has/takes 最优先。
但是,问题不在于查找优先级,而在于查找的方式。看起来好像 Spring 不喜欢这两行:
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
经过多次试验后我得出的结论是,由于 第二个正则表达式匹配的 routes/locations 也与第一个 匹配,它们被考虑在内第一行然后在第二行中不考虑(我在考虑查找过程,因为它从上到下逐行处理)。
所以我最后做的是改变我的测试属性的位置,比如
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
类似于
<value>classpath*:com/lala/project/**/configuration/test/*.properties
</value>