多个Spring配置文件的属性解析(yaml配置)

时间:2020-02-21 06:13:22

标签: spring spring-boot configuration

将多个配置文件用于属性解析时,是否存在定义的顺序。

我有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

Configuration.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

1 个答案:

答案 0 :(得分:1)

这是我可以依靠的东西吗?

是的,最后获胜的策略是一致的,documented in the reference guide

如果指定了多个配置文件,则采用后赢策略。例如,如果配置文件prod,live由spring.profiles.active属性指定,则application-prod.properties中的值可以被application-live.properties中的值覆盖。

(无关,但是关于您共享的文档的链接。我不知道这是否是偶然的,但这是6年前发布的Spring Boot 1.2.x的文档。)

相关问题