简体   繁体   English

通用类型的Spring Wiring动态bean

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM