我是春季靴的新手,这是我的Yaml的样子
configs:
-
collection: col1
groupId: groupId1
topic: topic1
-
collection: col2
groupId: groupId2
topic: topic2
我想将3个类的作用域定义为原型,并使用yaml中的属性,例如
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class mongoListener {
public mongoListener(@Value("${config.collection}") String collectionName) {
//do something
}
}
同样,还有2个类也将使用groupID和topic。我在这里停留在如何设计上。
如果任何人都可以解释如何实现这一目标,将会有很大的帮助。
答案 0 :(得分:0)
请尝试:
application.yaml
放入/src/main/resources/
。@Value
注释使用属性,例如:public mongoListener(@Value("${configs[0].collection}") String collectionName) {
// collectionName is 'col1'
//do something
}
[编辑1]
您可以创建singleton
个名称互不相同的bean,例如:
@Configuration
public class MyConfiguration {
@Bean("mongoListener_A")
public mongoListener mongoListener_A(@Value("${configs[0].collection}") String collectionName) {
return new mongoListener(collectionName);
}
@Bean("mongoListener_B")
public mongoListener mongoListener_B(@Value("${configs[1].collection}") String collectionName) {
return new mongoListener(collectionName);
}
// ... and so on
}
[编辑2]
您可以使用@ConfigurationProperties
批注将yaml配置读入java对象。
@Data //lombok annotation.
@Component("myConfigs")
@ConfigurationProperties
public class Configs {
private final List<Config> configs;
@Data //lombok annotation.
public static class Config {
private String collection;
private String groupId;
private String topic;
}
}
您可以从以下对象创建mongoListener
:
@Configuration
public class MyConfiguration {
@Bean
public List<mongoListener> mongoListeners(@Qualifier("myConfigs") Configs configs) {
return configs.getConfigs().stream()
.map(Config::getCollection)
.map(mongoListener::new)
.collect(Collectors.toList());
}
// ... and so on
}
bean仍然是singleton
,但是您可以根据yaml文件创建任意数量的实例。
另请参见
Use YAML for External Properties - Spring Boot Reference Documentation “How-to” Guides
Spring @Value with arraylist split and obtain the first value