来自Yaml的Spring配置-组合@ConfigurationEnabled加载以获取参数化的文件名

时间:2018-08-21 13:12:14

标签: spring spring-boot configuration yaml

我遇到的问题可能非常独特。我在同一项目中有两个应用程序,使用两个不同的spring配置文件。

运行它们时,我会手动加载上下文

context = new ClassPathXmlApplicationContext("hal.context.xml");
context.registerShutdownHook();

,然后在每个文件中指定所需的spring上下文文件。

问题出在配置上,因为我在yaml文件中存储了两个配置文件。

我最好的解决方案是使用Spring Boot工具通过

在POJO中加载配置(它们具有相同的结构)。
@org.springframework.context.annotation.Configuration("configuration")
@ConfigurationProperties
@EnableConfigurationProperties

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    yaml.setResources(new ClassPathResource("filename"));
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());

    return propertySourcesPlaceholderConfigurer;
}

我找不到以参数化方式加载配置的方法...是否有任何选项可以将其结合起来

<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
    <property name="resources" value="classpath:hal.config.yml"/>
</bean>

,而不是用作属性占位符<context:property-placeholder properties-ref="yamlProperties"/>来找到一种通过配置自动生成POJO的方法。

提前谢谢

路卡

1 个答案:

答案 0 :(得分:0)

您可以使用两个不同的前缀(每个配置文件一个)来分隔配置值:

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    propertySourcesPlaceholderConfigurer.setPlaceholderPrefix("${app1:");
    propertySourcesPlaceholderConfigurer.setPlaceholderSuffix("}");

    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    yaml.setResources(new ClassPathResource("app1_config_filename"));
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());

    return propertySourcesPlaceholderConfigurer;
}

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    propertySourcesPlaceholderConfigurer.setPlaceholderPrefix("${app2:");
    propertySourcesPlaceholderConfigurer.setPlaceholderSuffix("}");

    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    yaml.setResources(new ClassPathResource("app2_config_filename"));
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());

    return propertySourcesPlaceholderConfigurer;
}

然后将配置值注入到bean中时,您可以执行以下操作:

@Value("{$app1:myVal}")
String myVal;

@Value("{$app2:myVal}")
String myVal;

从app1和app2进入bean

希望这会有所帮助