【问题标题】:Different yml files for different Beans in SpringSpring中不同Bean的不同yml文件
【发布时间】:2017-07-12 08:37:35
【问题描述】:

在我的 Spring Boot 应用程序中,我有主 application.yml 文件。我有很多属性,因此我想要另一个 yml 文件,其中包含指定的属性,按它们的逻辑或其他东西分组。

如何配置一个 Bean,从一个新的 yml 文件加载和使用所有属性,以及从另一个新的 yml 加载另一个 Bean?它的最佳做法是什么?

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

【问题讨论】:

    标签: spring spring-boot properties resources yaml


    【解决方案1】:

    我终于有了!它是这样工作的:

    我有一个属性配置类,它会加载 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注解。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        相关资源
        最近更新 更多