[英]Spring Wiring dynamic bean of generic type
Using Spring 5.0.3 to register a dynamic bean using the BeanDefinitionRegistryPostProcessor
. 使用Spring 5.0.3使用
BeanDefinitionRegistryPostProcessor
注册动态bean。 The code looks as follows: 该代码如下所示:
class MyBDRRPP implements BeanDefinitionRegistryPostProcessor {
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// values - hardcoded for now
List<String> values = Arrays.asList("1", "22", "333");
registry.registerBeanDefinition("myDynamicBean",
BeanDefinitionBuilder.genericBeanDefinition(List.class, () -> values);
}
}
// Register MyBDRRPP with ApplicationContext - not shown here
// Consumer of the dynamic bean
class MyConsumer {
MyConsumer(@Qualifier("myDynamicBean") List<String> data) {
// do something with data
}
}
When the MyConsumer class gets wired, I get this exception 当MyConsumer类被连接时,我得到了这个异常
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.List<java.lang.String>' available: expected at least 1 bean which qualifies as autowire candidate.
If I change the constructor to use the raw
list type instead, it works (no wiring issues). 如果我将构造函数更改为使用
raw
列表类型,那么它将起作用(无接线问题)。
MyConsumer(@Qualifier("myDynamicBean") List data) {
// this works
}
How should I register my dynamic bean so that I can use the generic type instead? 我应该如何注册我的动态bean,以便可以使用泛型类型? Is there a way to provide some hint to Spring about the type while registering the bean?
在注册Bean时,是否可以向Spring提供一些有关类型的提示?
Here is how I ended up doing this: 这就是我最终这样做的方式:
class MyBDRRPP implements BeanDefinitionRegistryPostProcessor {
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// values - hardcoded for now
List<String> values = Arrays.asList("1", "22", "333");
// OLD Code
// registry.registerBeanDefinition("myDynamicBean", BeanDefinitionBuilder.genericBeanDefinition(List.class, () -> values);
// New Code
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(List.class, () -> values);
// Add the generic info
rootBeanDefinition.setTargetType(ResolvableType.forClassWithGenerics(List.class, String.class));
registry.registerBeanDefinition("myDynamicBean", rootBeanDefinition);
}
}
This now gets wired correctly in MyConsumer class. 现在,这在MyConsumer类中已正确连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.