在春季启动应用程序时,如何从资源目录加载所有.yml文件?

时间:2018-09-18 07:59:55

标签: spring spring-boot yaml

我在spring应用程序的resources目录中有2-3个.yml文件。 我想在应用程序启动时自动加载所有这些文件。

我尝试了下面的代码,但是没有用。

ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(YamlLoadApplication.class)
                .properties("spring.config.name:applicationTest,CountriesData",
                        "spring.config.location:src/main/resources/")
                .build().run(args);

        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        MutablePropertySources sources = environment.getPropertySources();

请帮助我解决此问题。实现这一目标的最佳方法是什么?我会在整个应用程序中使用所有这些yml文件值。

谢谢

2 个答案:

答案 0 :(得分:3)

您可以使用@PropertySource批注将您的配置外部化为属性文件。

Spring建议使用环境获取属性值。

env.getProperty("mongodb.db");

您可以提及该类中正在使用的属性文件。

@Configuration
    @PropertySource({
        "classpath:config.properties",
        "classpath:db.properties"
    })
    public class AppConfig {
        @Autowired
        Environment env;
    }

从Spring 4开始,您可以忽略ResourceNotFound以忽略未找到的属性文件

  @PropertySources({
        @PropertySource(value = "classpath:missing.properties", ignoreResourceNotFound=true),
        @PropertySource("classpath:config.properties")

示例摘自文章-https://www.mkyong.com/spring/spring-propertysources-example/

如果需要更多信息,请参阅该文章 From Spring documentation

答案 1 :(得分:1)

这里的一个问题"spring.config.location:src/main/resources/"spring.config.location设置为src/main/resources/,这不是类路径资源,而是文件系统资源。这是从您正在从中运行Spring Boot应用程序的当前目录中查找的。

多个修复程序:

指定完整的文件系统路径,如下所示:

public static void main(String[] args) {
    ConfigurableApplicationContext applicationContext;
    applicationContext = new SpringApplicationBuilder(YmlsApplication.class)
        .properties("spring.config.name:applicationTest,CountriesData",
            "spring.config.location:/Users/msimons/tmp/configs/")
        .build().run(args);

    ConfigurableEnvironment environment = applicationContext.getEnvironment();
    MutablePropertySources sources = environment.getPropertySources();
    sources.forEach(p -> System.out.println(p.getName()));
}

或指定类路径资源。注意,我将配置文件放在单独的目录下,该目录位于src/main/resources/custom-config

public static void main(String[] args) {
    ConfigurableApplicationContext applicationContext;
    applicationContext = new SpringApplicationBuilder(YmlsApplication.class)
        .properties("spring.config.name:applicationTest,CountriesData",
            "spring.config.location:classpath:/custom-config/")
        .build().run(args);

    ConfigurableEnvironment environment = applicationContext.getEnvironment();
    MutablePropertySources sources = environment.getPropertySources();
    sources.forEach(p -> System.out.println(p.getName()));
}

在路径内注意classpath:,并以/在资源的根级别开始目录。