Java 通用类型的弹簧接线动态bean

Java 通用类型的弹簧接线动态bean,java,spring,generics,autowired,Java,Spring,Generics,Autowired,使用Spring5.0.3使用BeanDefinitionRegistryPostProcessor注册动态bean。代码如下所示: class MyBDRRPP implements BeanDefinitionRegistryPostProcessor { public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // valu

使用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
   }
}

我应该如何注册我的动态bean,以便使用泛型类型?在注册bean时,有没有办法向Spring提供一些关于类型的提示

以下是我最终如何做到这一点的:

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);  
   }
}
类MyBDRRPP实现BeanDefinitionRegistryPostProcessor{ 公共无效后处理BeanDefinitionRegistry(BeanDefinitionRegistry注册表)引发BeanException{ //值-目前已硬编码 列表值=数组.asList(“1”、“22”、“333”); //旧代码 //registry.registerBeanDefinition(“myDynamicBean”,BeanDefinitionBuilder.genericBeanDefinition(List.class,()->value); //新代码 RootBeanDefinition RootBeanDefinition=新的RootBeanDefinition(List.class,()->value); //添加通用信息 setTargetType(ResolvableType.forClassWithGenerics(List.class,String.class)); registry.registerBeanDefinition(“myDynamicBean”,rootBeanDefinition); } } 这现在在MyConsumer类中正确连接

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);  
   }
}