多个 Spring 配置文件的属性解析(yaml 配置)
Posted
技术标签:
【中文标题】多个 Spring 配置文件的属性解析(yaml 配置)【英文标题】:Property resolving for multiple Spring profiles (yaml configuration) 【发布时间】:2020-06-05 13:16:33 【问题描述】:当多个配置文件用于属性解析时是否有定义的顺序。
我有 yaml 配置文件:
name: none
---
spring:
profiles: prod
name: prodName
---
spring:
profiles: dev
name: devName
当应用程序在没有(默认)配置文件的情况下运行时,会打印none
。对于 dev/prod 配置文件 devName/prodName 已打印(到目前为止一切正常)。
当我尝试将配置文件定义为打印dev,prod
prodName
时,当我指定prod,dev
时打印devName
。
这是我可以依赖的东西吗?我的意思是它是在 Spring 中指定的吗?我没找到here。
完整版(用于复制)
application.yml
name: none
---
spring:
profiles: dev
name: devName
---
spring:
profiles: prod
name: prodName
配置.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@ConfigurationProperties
public class Configuration
String name;
public String getName()
return name;
public void setName(String name)
this.name = name;
SpringBootConsoleApplication.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner
private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class);
@Autowired
Configuration conf;
public static void main(String[] args)
SpringApplication.run(SpringBootConsoleApplication.class, args);
@Override
public void run(String... args)
LOG.info("name: ", conf.name);
编辑:
GitHub repository
样本输出:
c:\betlista\SpringPropertyResolutionMultipleProfiles>java -jar target\spring-boot-console-app-1.0.jar
...: name: none, label: labelValue
c:\betlista\SpringPropertyResolutionMultipleProfiles>java -jar -Dspring.profiles.active=dev target\spring-boot-console-app-1.0.jar
...: name: devName, label: labelValue
c:\betlista\SpringPropertyResolutionMultipleProfiles>java -jar -Dspring.profiles.active=dev,prod target\spring-boot-console-app-1.0.jar
...: name: prodName, label: labelValue
c:\betlista\SpringPropertyResolutionMultipleProfiles>java -jar -Dspring.profiles.active=prod,dev target\spring-boot-console-app-1.0.jar
...: name: devName, label: labelValue
编辑 2:
主题
有一个问题我称之为主题 - Multiple properties file for a single spring profile
虽然@PropertySource
可以与属性文件一起使用,但它不能与 YAML 文件一起使用。我目前知道的唯一解决方案是使用例如-Dspring.config.additional-location=classpath:topic1.yml
编辑 3:
"duplicate" question 有与我在这里相同的问题,但没有答案。这个问题是关于豆子的,而不是真正的属性。接受的答案说“spring.profiles.active system property
无关紧要。”,我显示为不正确(在属性的上下文中)。如果您同意,请投票支持重新开放。
【问题讨论】:
它将被 .yml 文件中给出的最后一个配置文件覆盖。如果您已经定义了 dev 然后是 prod。然后最终 prod 将被覆盖。 不,这不是我的工作方式...这取决于您指定的活动配置文件... 这个问题在没有正确答案的情况下关闭,请投票重新打开,因为创建新问题(副本)对我来说毫无意义...... 答案中的粗体部分就是您所需要的:“最后一个 bean 定义获胜”。当您使用“prod,dev”时,“dev”键将在 “prod”键之后加载,因此您自己已经注意到了。 是的,我可以看到原始问题与您的问题不同(除了结果相同)。我很快就会在这里添加一个答案。 【参考方案1】:这是我可以依赖的东西吗?
是的,最后赢的策略是一致的,是documented in the reference guide:
如果指定了多个配置文件,则应用最后获胜的策略。例如,如果配置文件 prod,live 由 spring.profiles.active 属性指定,则 application-prod.properties 中的值可以被 application-live.properties 中的值覆盖。
(无关,但关于您共享的文档的链接。我不知道这是否是一个意外,但这是 6 年前发布的 Spring Boot 1.2.x 的文档)。
【讨论】:
谢谢,正是我想要的。也许我当时正在使用一些 Spring Boot 1.2 应用程序......以上是关于多个 Spring 配置文件的属性解析(yaml 配置)的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 配置文件详解:Properties和YAML