如何获得由FactoryBean spring创建的bean?

Joh*_*erg 33 java spring autowired

FactoryBean的可用于以编程方式创建,这可能需要复杂的实例化逻辑的对象.

但是,似乎由它创建的bean FactoryBean不会成为弹簧管理.这种解释是否正确?如果是这样,有什么好的解决方法吗?包含一个简短的代码示例来说明我的问题.

ApplicationContext的:

<bean id="searcher" class="some.package.SearcherFactory" /> 
<bean id="service" class="some.package.Service" /> 
Run Code Online (Sandbox Code Playgroud)

工厂实施:

public class SearcherFactory implements FactoryBean<Searcher> {

    @Override
    public Searcher getObject() throws Exception {
        return new Searcher(); // not so complex after all ;)
    }

    @Override
    public Class<Searcher> getObjectType() {
        return Searcher.class;
    }
    .... 
}
Run Code Online (Sandbox Code Playgroud)

工厂创建的类:

public class Searcher() {
      private Service service;

      @Autowired
      public void setService(Service service) {
           // never invoked
           this.service=service;
      } 
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*oyd 29

这是一个FactoryBean为您自动装配的抽象实现:

public abstract class AbstractAutowiringFactoryBean<T> extends
    AbstractFactoryBean<T> implements ApplicationContextAware{

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(
        final ApplicationContext applicationContext){
        this.applicationContext = applicationContext;
    }

    @Override
    protected final T createInstance() throws Exception{
        final T instance = doCreateInstance();
        if(instance != null){
            applicationContext
              .getAutowireCapableBeanFactory()
              .autowireBean(instance);
        }
        return instance;
    }

    /**
     * Create the bean instance.
     * 
     * @see #createInstance()
     */
    protected abstract T doCreateInstance();

}
Run Code Online (Sandbox Code Playgroud)

扩展它,实现getObjectType()doCreateInstance()方法,然后启动并运行自动装配.

注意:不应用BeanPostProcessors,这需要额外的代码.

  • 提高可重用性也不是坏主意。尽管我不知道为什么我们的朋友没有在Springsource上提供此模板作为模板。 (2认同)

ska*_*man 21

由创建的对象FactoryBean 由Spring管理,而不是由Spring实例化或配置.通过使用a FactoryBean,您自己负责.所有注射和配置必须由FactoryBean

有一种替代方案可以更好地为您工作 - 使用基于注释的配置而不是基于XML的配置.这意味着您可以在Java中使用复杂的实例化逻辑,同时仍然可以使用@Autowired对象本身.

我现在倾向于为所有非平凡的Spring应用程序使用注释样式配置,它使许多事情变得更容易.

  • 那么,你将如何解决作者的问题?你能用适当的java配置更新答案吗? (7认同)

Ros*_*atl 18

那这个呢 ?

<bean id="serviceFactory"
      class="some.package.SearcherFactory" />


<bean id="service"
      factory-bean="serviceFactory"
      factory-method="getObject"/>
Run Code Online (Sandbox Code Playgroud)

...然后只需注入bean'service',而不关心代码中的工厂