如何使用Spring Boot应用程序中另一个属性文件中的值解析属性文件中的占位符

时间:2019-02-26 10:16:45

标签: java spring-boot configuration properties-file property-placeholder

我的spring boot应用程序具有以下属性文件。

src/main/resources/config/DEV/env.properties
mail.server=dev.mail.domain

src/main/resources/config/QA/env.properties
mail.server=qa.mail.domain

src/main/resources/config/common/env.properties
mail.url=${mail.server}/endpoint

是否可以加载“ common / env.properties”,以便使用给定的环境特定的属性文件解析其占位符。对于DEV环境,我们希望使用“ DEV / env.properties”中的值来解析“ common / env.properties”中的占位符。

对于如何加载多个属性文件和基于配置文件的加载有一些答案,但找不到针对此特定用例的答案。

谢谢。

3 个答案:

答案 0 :(得分:0)

您可以通过在类配置中声明属性源并在路径中设置环境变量来实现此目的:

@PropertySource({ "classpath:config/${env}/env.properties" })
@Configuration
public class config{}

然后使用命令行变量-env=dev

启动spring boot应用程序

更新

您可以使用@PropertySources批注来加载多个属性。

 @PropertySources({
    @PropertySource("classpath:config/${env}/env.properties"),
    @PropertySource("classpath:config/common/env.properties")
  })
  public class config{}

答案 1 :(得分:0)

2个选项:

  1. 使用common/application.properties生成configuration-maven-plugin,并为每个环境过滤文件。现在已经过时了。
  2. 在每个环境中使用application-<env>.properties,并在应用程序启动时将-Dspring.profiles.active=<env>作为VM选项传递。 Spring将自动从正确的文件中获取属性。

在选项2中,您将使用application-.properties覆盖application.properties中存在的任何内容。因此,您不必仅添加需要根据环境更改的属性。

例如:

您的application.properties可以拥有

logging.level.root=WARN
logging.level.org.apache=WARN
logging.level.org.springframework=WARN

您的application-dev.properties可以拥有

logging.level.org.springframework=DEBUG

这意味着,当您使用dev配置文件启动应用程序时,spring需要

logging.level.root=WARN
logging.level.org.apache=WARN
logging.level.org.springframework=DEBUG

编辑:

此外,您可以在课堂上尝试以下类似的方法。 (Spring将使用config-dev.properties中的值覆盖config.properties中的值)。 ignoreResourceNotFound将确保即使没有找到相应的文件,应用程序仍将以默认值启动。

@Configuration
@PropertySource("classpath:config.properties")
@PropertySource(value = "classpath:config-${spring.profiles.active}.properties", ignoreResourceNotFound = true)

答案 2 :(得分:0)

您可以添加resources / application.yml文件,其中一个文件中可以包含多个配置文件。 MultiProfile Yaml 例如,这里有两个不同的配置文件'dev'和'qa',其应用程序名称分别为'DEV'和'QA',以及一个defaultName'Default'

spring:
  application:
    name: Default
  profiles:
    active: qa

---
spring:
  profiles: dev
  application:
    name: DEV
---
spring:
  profiles: qa
  application:
    name: QA