2014-09-03 72 views
1

我有一组FactoryBean的实例,它们的类型为MyFactoryBean。构造函数采用Class<?>,并使用它来确定如何从getObject()返回:如何以编程方式在Spring中注册FactoryBean的实例

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(..., ...); 

不过,这并不觉得不对劲,和自动装配不起作用。我如何将这些注册到我的上下文中?


编辑:的自动装配,我已经在这里指出的肖恩·帕特里克·弗洛伊德响应:How to get beans created by FactoryBean spring managed?但是这仍然没有回答我的问题。

回答

2

我创建这到底解决办法,但我不知道是否它最好与否:

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

采取以下讨论一下:How to inject dependencies into a self-instantiated object in Spring?

我认为,这是您需要的东西:使用AutowireCapableBeanFactory

+0

我如何注册一个'AutowireCapableBeanFactory'用''AnnotationConfigApplicationContext? – Cheetah 2014-09-03 16:23:30

+0

您应该创建将在Spring上下文中生存的bean,将'AutowireCapableBeanFactory'注入到其中并使用它以编程方式创建其他实例。如果您使用与我引用的代码类似的代码,则这些实例将自动装配。 – AlexR 2014-09-04 07:12:20

相关问题