Java 通用类型的弹簧接线动态bean
使用Spring5.0.3使用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
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);
}
}