gpt4 book ai didi

java - 使用 FactoryBean 创建泛型实例时,Spring 自动接线无法泛型

转载 作者:行者123 更新时间:2023-11-30 10:26:10 26 4
gpt4 key购买 nike

我正在尝试在 spring 版本 4.3.6 中解析 FactoryBean 中的泛型类型。我使用用于创建任意数量的 CarClient 实例的 FactoryBean 创建 bean。

public class CarFactoryBean<T> implements FactoryBean<CarClient<T>>{

@Autowired
CarClientCreationHelper cch;

private Class<T> type;

@Overrides
public CarClient<T> getObject() throws Exception {
return cch.provideCar(type);
}

@Override
public Class<?> getObjectType() {
ResolvableType resolvableType = ResolvableType.forClassWithGenerics(CarClient.class, type);
return resolvableType.resolve();
}

@Override
public boolean isSingleton() {
return true;
}

public void setType(Class<T> type) {
this.type = type;
}
}

我正在按如下方式注册这些 bean,

public class CarClientRegistrar  implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware {

private MyBeanNameGenerator bng;

public CarClientRegistrar(){
this.bng = new MyBeanNameGenerator();
}


@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//logic to obtain serviceInterface, working correctly

AbstractBeanDefinition definition = BeanDefinitionBuilder.genericBeanDefinition(CarFactoryBean.class)
.addPropertyValue("type", serviceInterface)
.getBeanDefinition();

definition.setDescription("desc");

final String beanName = bng.generateBeanName(definition, registry);
BeanDefinitionReaderUtils.registerBeanDefinition(new BeanDefinitionHolder(definition, beanName,
new String[]{beanName.substring(0, beanName.lastIndexOf("/"))}), registry);

}
}

最后,我在 AppConfig 中导入 CarClientRegistrar,

@Import({CarClientRegistrar.class})
public class ApplicationConfig {

}

并 Autowiring 一个 CarClient,

  @RestController
@RequestMapping(value = "blah")
public class CallsController {
private CarClient<Ford> fb;

@Autowired
public CallsController(CarClient<Ford> fordBean){
this.fb = fordBean;
}
}

我得到以下异常,

通过构造函数参数 1 表示的未满足的依赖;嵌套异常是 org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有可用类型为“com.empire.client.CarClient”的合格 bean:预期单个匹配 bean 但找到 2:car1Impl、car2Impl

但是,如果我将 fordBean 重命名为 car1Impl(这是必需的 bean),它会起作用

 @Autowired
public CallsController(CarClient<Ford> car1Impl){
this.fb = fordBean;
}

关于如何在不依赖于 bean 名称(但依赖于类型)的情况下解析 FactoryBean 中的通用类型的任何想法?

ResolvableType resolvableType = ResolvableType.forClassWithGenerics(CarClient.class, type);
return resolvableType.resolve();

好像不行。

提前致谢!

最佳答案

我通过解析 CarClientRegistrar 中的类型并将其作为目标类型分配给 BeanDefinition 来解决这个问题。

ResolvableType resolvableType = ResolvableType.forClassWithGenerics(AsyncClient.class, serviceInterface);

RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
rootBeanDefinition.setTargetType(resolvableType);
rootBeanDefinition.setBeanClass(CarFactoryBean.class);
rootBeanDefinition.getPropertyValues().add("type", serviceInterface);
rootBeanDefinition.setDescription("desc");

而不是使用 GenericBeanDefinition

关于java - 使用 FactoryBean 创建泛型实例时,Spring 自动接线无法泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45829442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com