繁体   English   中英

Spring - “context:property-placeholder” - 属性优先级

[英]Spring - “context:property-placeholder” - property priority

我有一个由许多应用程序组成的项目。
我在我的一个应用程序中有这个。

<context:property-placeholder location="file:/config/p1.properties,file:/config/p2.properties" />

现在,我想在p2.properties定义一个已存在于p1.properties中的p1.properties 那就是我想在p2中基本覆盖该属性(给它一个不同的值)。 这是因为在运行时p1在许多应用程序之间共享,而p2仅由我的应用程序使用。 所以我不想影响所有应用程序,只是我的应用程序。

1)我想知道我将在p2中定义的属性值是否优先。
2) location的顺序是否重要,如果是,则第二个
优先于第一个?

您配置property-placeholderp2.properties任何属性将优先于p1.properties中的p1.properties

这是因为最后一个文件中的属性始终优先。

您设置的是SysAdmins或DevOps人员覆盖应用程序属性的标准方法。 例如,您可以将第一个文件作为类路径属性文件,而第二个文件可能就像您拥有它一样,这是一个基于文件系统的属性文件,其值覆盖第一个文件系统中的值。

如果检查PropertiesLoaderSupportJavaDoc (它处理资源的加载并且是由PropertySourcesPlaceholderConfigurer扩展的抽象类),您将在setLocations方法中看到它具有以下注释

注意:在重叠键的情况下,在以后的文件中定义的属性将覆盖先前定义的文件的属性。 因此,请确保最具体的文件是给定位置列表中的最后一个文件。

您可以通过定义2个占位符并使用“order”属性来明确优先顺序。 下面是我的一个应用程序的示例,其中外部配置文件将始终覆盖类路径上的那个。

<!-- DEFINE TWO CONFIGURATION FILES: FOR LOCAL DEVELOPMENT THESE WILL NORMALLY 
        BE READ FROM A FILE BUNDLED WITH APPLICATION. ONCE DEPLOYED THESE SHOULD 
        BE READ FROM AN EXTERNAL CONFIGURATION FILE AT THE SPECIFIED LOCATION. THE 
        EXTERNAL FILE SHOULD OVERRIDE THE BUNDLED FILE (CONTROLLED VIA THE ORDER 
        ATTRIBUTE: LOWEST WINS) -->

    <context:property-placeholder
        location="file:/apps/jboss-jpp/jboss-jpp-6.0/standalone/configuration/land.properties"
        ignore-resource-not-found="true" ignore-unresolvable="true" order="1" />

    <context:property-placeholder location="classpath*:/land.properties"
        ignore-resource-not-found="false" ignore-unresolvable="false" order="2" />

根据我的经验,位置的顺序很重要。 文件按声明的顺序加载(p2之前的p1)。
如果多次声明属性,则它是最后找到的值。 (所以p2中的值)

我们经常使用此系统来覆盖特定于环境的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM