gpt4 book ai didi

java - 如何在 Spring 中以编程方式注册 FactoryBean 实例

转载 作者:行者123 更新时间:2023-11-30 03:46:08 24 4
gpt4 key购买 nike

我有一组 FactoryBean 的实例其类型为MyFactoryBean 。构造函数采用 Class<?>并使用它来确定从 getObject() 返回什么:

public class MyFactoryBean implements FactoryBean {

private final Class<?> type;

public MyFactoryBean(Class<?> type) {
this.type = type;
}

@Override
public Object getObject() throws Exception {
return null; // Obviously I return something here rather than null!
}

@Override
public Class<?> getObjectType() {
return type;
}

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

我的最终结果是控制当类型实例传递给MyFactoryBean的构造函数时返回的内容。是从上下文中请求的。

我可以像这样在我的上下文中注册它们:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.getBeanFactory().registerSingleton(..., ...);

但是感觉不太对劲,而且 Autowiring 不起作用。我如何在我的上下文中注册这些?

<小时/>

编辑:对于 Autowiring ,我注意到肖恩·帕特里克·弗洛伊德在这里的回复:How to get beans created by FactoryBean spring managed?但这仍然没有回答我的问题。

最佳答案

我最终创建了这个解决方案,但我不确定它是否是最好的:

    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.addBeanFactoryPostProcessor(new BeanDefinitionRegistryPostProcessor() {

@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
ConstructorArgumentValues cav = new ConstructorArgumentValues();
cav.addGenericArgumentValue(MyClass.class);

RootBeanDefinition bean = new RootBeanDefinition(MyFactoryBean.class, cav, null);
AnnotationBeanNameGenerator generator = new AnnotationBeanNameGenerator();

registry.registerBeanDefinition(generator.generateBeanName(bean, registry), bean);
}

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { }
});

关于java - 如何在 Spring 中以编程方式注册 FactoryBean 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25649105/

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