gpt4 book ai didi

spring - 正确使用 Spring 环境配置文件以管理 PropertySourcesPlaceholderConfigurer 和属性文件集

转载 作者:IT老高 更新时间:2023-10-28 13:55:25 25 4
gpt4 key购买 nike

我正在开发一个 Spring 应用程序,我意识到我在管理我的属性的方式上存在问题。 我使用 Spring 环境配置文件来加载我的属性,并且我最近添加了更多配置文件,这使我的属性文件无法管理

属性文件位于 src/main/resources/META-INF/props/ 内的不同文件夹中,每个文件夹与不同的 Spring 环境配置文件匹配。

我现在至少有 5 个配置文件,这意味着我有 5 个子文件夹,每个子文件夹都包含具有相同名称但只有某些键具有不同值的属性文件

这是它的外观:

properties file screen capture

这是我配置我的 PropertyPlaceholders 的方式:

@Configuration
public class PropertyPlaceholderConfiguration {

@Profile(Profiles.CLOUD)
static class cloudConfiguration {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() throws IOException {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(Boolean.TRUE);
propertySourcesPlaceholderConfigurer.setLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:META-INF/props/cloud/*.properties"));
return propertySourcesPlaceholderConfigurer;
}
}

@Profile(Profiles.DEFAULT)
static class defaultConfiguration {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() throws IOException {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(Boolean.TRUE);
propertySourcesPlaceholderConfigurer.setLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:META-INF/props/default/*.properties"));
return propertySourcesPlaceholderConfigurer;
}
}

@Profile(Profiles.TEST)
static class testConfiguration {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() throws IOException {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(Boolean.TRUE);
propertySourcesPlaceholderConfigurer.setLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:META-INF/props/test/*.properties"));
return propertySourcesPlaceholderConfigurer;
}
}

@Profile(Profiles.DEV)
static class devConfiguration {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() throws IOException {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(Boolean.TRUE);
propertySourcesPlaceholderConfigurer.setLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:META-INF/props/dev/*.properties"));
return propertySourcesPlaceholderConfigurer;
}
...
}

总结一下,我的问题如下:

  • 键/值对在 5 个不同的文件夹中重复,因为只有少数值不同。

因此,我正在寻找一种新策略来管理不同环境之间的差异。

有人可以帮忙吗?

最佳答案

有很多方法可以做到这一点,但我认为你走在正确的道路上。属性文件的覆盖是通过 BeanFactoryPostProcessors 完成的,在这种情况下有两种实现可以帮助您,因此您不必从头开始:

PropertySourcesPlaceholderConfigurer & PropertyOverrideConfigurer。

这是一个使用 PropertySourcesPlaceholderConfigurer 的示例:

<bean id="someProperties" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer" abstract="true" >
<property name="locations">
<list>
<value>classpath:database.properties</value>
<value>classpath:email.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="false"/>
</bean>

<bean id="devProperties" parent="someProperties" >
<property name="properties" >
<props >
<prop key="database.username">Database Username used for Development Environment </prop>
</props>
</property>
<property name="localOverride" value="true" />
</bean>

<bean id="testProperties" parent="someProperties" >
<property name="properties" >
<props >
<prop key="database.username">Database Username used for Testing Environment </prop>
</props>
</property>
<property name="localOverride" value="true" />
</bean>

在该示例中,您将默认属性加载到将用作其他 bean 模板的 bean 中,并且在特定 bean 中,例如 TestEnvironmentProperties Bean 或 DevEnvironmentProperties Bean 您只覆盖要从默认值覆盖的特定属性属性文件。该示例仅显示如何覆盖特定属性而无需创建另一个属性文件,从那里您可以决定如何选择使用工厂、简单外观类或配置文件系统创建哪个 bean,任何您喜欢并匹配您的架构。

此外,如果您认为此选项过于冗长,您可以使用 property-placeholder元素。

我向你推荐这本书:

Getting started with Spring Framework, Second Edition

它在第 5 章中提供了您需要的示例。什么都没写,前段时间才买的,看了这么多烂春书,很喜欢。

关于spring - 正确使用 Spring 环境配置文件以管理 PropertySourcesPlaceholderConfigurer 和属性文件集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23618518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com