在我的spring启动应用程序中,我有主application.yml文件。我有很多属性,因此我希望有另一个yml文件,其中包含指定的属性,按逻辑或其他方式分组。
如何配置Bean,从一个新的yml文件加载和处理所有属性,以及从另一个新的yml加载另一个Bean?它的最佳实践是什么?
我找到了使用YamlPropertiesFactoryBean
的示例,这个bean可以读取多个资源(yml文件),但是在另一个Bean中,当我自动装配这个YamlPropertiesFactoryBean
时,我无法获得那个特定的yml,因为此getObject()
的{{1}}将包含我添加到其中的所有yml资源。
答案 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