根据活动配置文件从自定义文件加载属性

时间:2019-10-10 18:59:18

标签: java spring-boot spring-profiles spring-properties

我有一个带有最新SpringBoot v.2.1.9的应用程序。该项目包含几个带有模式的自定义文件,如下所示:

  • file1-dev.properties
  • file1-prod.properties
  • file2-dev.properties
  • file2-prod.properties等。

我想达到与Spring的application- {profile} .properties类似的行为,我的意思是从文件加载与活动配置文件匹配的每个自定义道具。由于大量的属性,我无法将它们存储在application- {profile} .properties中,因为这会引起可读性问题。

我想找到一个严格的Java解决方案,而没有任何Maven的变通办法,即在构建后物理替换文件。 您能告诉我我该怎么做吗?

我目前的假设是从ApplicationContextInitializer覆盖一个initialize方法,然后检查配置文件并执行逻辑以选择文件,但是我不确定这是否是最有效的方法。

在此先感谢您的帮助。

@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
    String profile = System.getProperty("spring.profiles.active");
    //selecting files according to active profile
    applicationContext.getEnvironment().getPropertySources().addLast(prop);
}

1 个答案:

答案 0 :(得分:1)

我已经解决了我的问题。如果有人遇到同样的麻烦,请在下面找到我的解决方案:

1)实现EnvironmentPostProcessor并覆盖postProcessEnvironment方法。

2)从资源获取文件->我使用了org.springframework.core.io.support包中的PathMatchingResourcePatternResolver类。传递ClassLoader实例后,就可以执行getResources(String path)方法。

3)遍历Resource []数组,然后选择满足您需求的对象

4)创建一个PropertiesPropertySourceLoader实例,并从资源的路径中加载属性。

@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
    Resource[] resources = getResources("classpath*:/properties/*.*");
    List<List<PropertySource<?>>> propertySources = getPropertySources(resources);
    for (int i = 0; i < propertySources.size(); i++) {
        propertySources.get(i).forEach(propertySource -> environment.getPropertySources().addLast(propertySource));
    }
    application.setEnvironment(environment);
}

private Resource[] getResources(String path) {
    ClassLoader classLoader = this.getClass().getClassLoader();
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader);
    try {
        return resolver.getResources(path);
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to load props configuration " + ex);
    }
}