我有一个带有最新SpringBoot v.2.1.9的应用程序。该项目包含几个带有模式的自定义文件,如下所示:
我想达到与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);
}
答案 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);
}
}