2017-02-22 16 views
1

В моем приложении загрузки весны у меня есть основной файл application.yml. У меня много свойств, и поэтому я хотел бы иметь еще один файл yml, который содержит указанные свойства, сгруппированные по их логике или чему-то еще.Различные файлы yml для разных фасолей весной

Как настроить Bean для загрузки и работы всех свойств из одного нового yml-файла и другого Bean из другого нового yml? Для чего лучше всего?

Я нашел примеры использования YamlPropertiesFactoryBean, и этот компонент может читать несколько ресурсов (YML файлы), но в другом Bean, когда я autowire этот YamlPropertiesFactoryBean, я не могу получить, что конкретный YML, потому что getObject() этого YamlPropertiesFactoryBean будет иметь все ресурсы yml, которые я добавил к нему.

ответ

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; 
    } 

} 

И, наконец, у меня есть два фасоли (менеджеры), которые держат только соответствующие свойства 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

Бобы не должны знать о файлах yaml. Файлы yaml - это только те источники, которые используются для создания экземпляра Spring Environment.

Если вы хотите определенные свойства для конкретных компонентов, лучшим способом является префикс этих свойств в application.yaml, а затем используйте @ConfigurationProperties с аргументом префикса, который вы хотите использовать, чтобы связать эти свойства с bean-компонентом обсуждаемый.

Смотрите здесь:

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

Смежные вопросы