使用Spring5.0.3使用BeanDefinitionRegistryPostProcessor
注册动态bean。代码如下所示:
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
}
}
当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.
如果我将构造函数改为使用raw
列表类型,它将正常工作(没有连接问题)。
MyConsumer(@Qualifier("myDynamicBean") List data) {
// this works
}
我应该如何注册我的动态bean,以便我可以使用泛型类型?有没有办法在注册bean时向Spring提供一些有关类型的提示?
发布于 2018-06-07 04:30:46
这就是我是如何做到这一点的:
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);
}
}
这现在可以在MyConsumer类中正确连接。
https://stackoverflow.com/questions/49932184
复制相似问题