使用两个yaml文件进行配置属性

时间:2016-10-07 15:45:11

标签: java spring-boot properties configuration yaml

我们正在使用一个Spring启动应用程序,其中属性从application.yml文件而不是application.properties加载,位于src/main/resources/,如下所示:

config: 
  host: localhost:8080  
  server: 123  

他们被收入.java这样的文件

@ConfigurationProperties( prefix="config")  
public class ConnectionImpl implements Connection{
  @Value("${config.host}")
  private Stringhost;
} 

我能够以这种方式检索属性。 但我们正在尝试将配置属性从application.yml移动到位于其他位置的另一个.yml文件。 (src/main/resources/env-config)。
现在我无法以相同的方式检索属性,即使用@Value注释。我需要添加其他注释吗?

3 个答案:

答案 0 :(得分:8)

来自documentation

  

SpringApplication将从以下位置的application.properties(或application.yml)文件中加载属性,并将其添加到Spring Environment

     
      
  1. 当前目录的/config子目录。
  2.   
  3. 当前目录
  4.   
  5. 类路径/config
  6.   
  7. 类路径根
  8.         

    如果您不喜欢application.properties作为配置文件名,可以通过指定spring.config.name环境属性来切换到另一个。 您还可以使用spring.config.location环境属性(以逗号分隔的目录位置列表或文件路径)来引用显式位置

         

    无论classpath:,classpath:/config,file:,file:config/的值如何,始终使用默认搜索路径spring.config.location。此搜索路径按从最低优先级到最高优先级排序(file:config/获胜)。如果您确实指定了自己的位置,则它们优先于所有默认位置,并使用相同的最低到最高优先级排序。通过这种方式,您可以在application.properties(或使用spring.config.name选择的任何其他基本名称)中为应用程序设置默认值,并在运行时使用不同的文件覆盖它,保留默认值。

您需要提供一个命令行参数,告诉SpringApplication具体查看的位置。如果resources/中的所有内容都添加到类路径根目录中,那么您的命令行将如下所示:

java -jar myproject.jar --spring.config.location=classpath:/env-config/service-config.yml

如果application.yml下的常规resources/,其中的属性仍会被加载,但优先级会低于命令行中指定的属性文件。

答案 1 :(得分:5)

您的问题并没有真正说出您打算做什么,但如果您想为不同的环境设置不同的配置(例如developmenttestproduction),那么是一个简单的解决方案。

将配置文件放在项目中的文件层次结构中:

src/
  main/
    resources/
      application.yml
      application-development.yml
      application-test.yml
      application-production.yml

现在使用

启动应用程序
java -jar mySpringApplication.jar -Dspring.profiles.active=development

来自application.yml的配置将被视为“基础层”,由application-development.yml中的配置覆盖。这样,您可以为application.yml中的所有环境和application-ENV.yml文件中的特定于环境的配置设置“默认”设置。同样适用于testproduction

答案 2 :(得分:3)

没有

如果您避免在代码库中编写类似文件路径的硬编码,那么您将处于更好的位置。 @ConfigurationProperties过去曾使用locations属性,但已弃用,已在1.5中删除。

在Spring Boot中,您可以配置Environment,这是您配置的单一事实来源。您应该将Spring Boot配置为读取所需的文件,而不是将设置隐藏在代码中。 Read the documentation for spring.config.location。如果您想以更透明的方式执行此操作,可能需要EnvironmentPostProcessor is what you need