使用两个 yaml 文件作为配置属性

我们正在使用一个弹簧引导应用程序,其中属性是从文件加载的,而不是位于 ,如下所示:application.ymlapplication.propertiessrc/main/resources/

config: 
  host: localhost:8080  
  server: 123  

它们被拉入一个像这样的文件中.java

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

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


答案 1

文档中

SpringApplication将从以下位置的(或)文件中加载属性,并将它们添加到Spring中:application.propertiesapplication.ymlEnvironment

  1. 当前目录的子目录。/config
  2. 当前目录
  3. 类路径包/config
  4. 类路径根目录

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

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

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

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

如果在 下有一个 general,则仍会加载其中的属性,但对命令行上指定的属性文件的优先级较低。application.ymlresources/


答案 2

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

将配置文件放在项目内部的文件层次结构中:如下所示:

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

当您现在启动应用程序时

java -jar mySpringApplication.jar -Dspring.profiles.active=development

中的配置将被视为“基础层”,由 中的配置覆盖。通过这种方式,您可以为文件中的所有环境设置“默认”设置,并在文件中具有特定于环境的配置。同样适用于 和 。application.ymlapplication-development.ymlapplication.ymlapplication-ENV.ymltestproduction