Spring中不同Bean的不同yml文件

时间:2017-02-22 10:48:09

标签: spring spring-boot properties resources yaml

在我的spring启动应用程序中,我有主application.yml文件。我有很多属性,因此我希望有另一个yml文件,其中包含指定的属性,按逻辑或其他方式分组。

如何配置Bean,从一个新的yml文件加载和处理所有属性,以及从另一个新的yml加载另一个Bean?它的最佳实践是什么?

我找到了使用YamlPropertiesFactoryBean的示例,这个bean可以读取多个资源(yml文件),但是在另一个Bean中,当我自动装配这个YamlPropertiesFactoryBean时,我无法获得那个特定的yml,因为此getObject()的{​​{1}}将包含我添加到其中的所有yml资源。

2 个答案:

答案 0 :(得分:2)

最后我拥有它!这是它的工作原理:

我有一个属性配置类,它加载yml文件:

@Configuration
public class PropertiesConfig {

    public static final String PERSONS_FILE_NAME = "persons.yml";
    public static final String FOODS_FILE_NAME = "foods.yml";

    @Bean
    public PropertySourcesPlaceholderConfigurer properties() {
        final PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
        final YamlPropertiesFactoryBean personsYaml = personsPropertiesFromYamlFile();
        final YamlPropertiesFactoryBean foodsYaml = foodsPropertiesFromYamlFile();
        propertySourcesPlaceholderConfigurer.setPropertiesArray(personsYaml.getObject(), foodsYaml.getObject());
        return propertySourcesPlaceholderConfigurer;
    }

    @Bean
    @Qualifier(PersonsManager.QUALIFIER_NAME)
    public YamlPropertiesFactoryBean personsPropertiesFromYamlFile() {
        final YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new ClassPathResource(PERSONS_FILE_NAME));
        return yaml;
    }

    @Bean
    @Qualifier(FoodsManager.QUALIFIER_NAME)
    public YamlPropertiesFactoryBean foodsPropertiesFromYamlFile() {
        final YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new ClassPathResource(FOODS_FILE_NAME));
        return yaml;
    }

}

最后,我有两个bean(管理器),它们只保存相应的yml属性:

@Component
public class PersonsManager extends YmlPropertiesManager {

    public static final String QUALIFIER_NAME = "personsYaml";

    @Autowired
    public PersonsManager(@Qualifier(QUALIFIER_NAME) YamlPropertiesFactoryBean yamlObject) {
        super(yamlObject);
    }

    ...

}

@Component
public class FoodsManager extends YmlPropertiesManager {

    public static final String QUALIFIER_NAME = "personsYaml";

    @Autowired
    public FoodsManager(@Qualifier(QUALIFIER_NAME) YamlPropertiesFactoryBean yamlObject) {
        super(yamlObject);
    }

    ...

}

所以这里的主要内容是@Qualifier注释。

答案 1 :(得分:1)

Beans不应该知道yaml文件。 yaml文件只是用于构建Spring Environment实例的源代码。

如果您需要特定bean的特定属性,最好的方法是在application.yaml中为这些属性添加前缀,然后使用带有您要使用的前缀参数的@ConfigurationProperties,将这些属性绑定到bean中。问题

见这里:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html