如何获得由FactoryBean Spring管理的豆子?

2022-09-01 07:18:15

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

然而,似乎由创造的豆子并没有成为春天管理的。这种解释是否正确?如果是这样,是否有任何好的解决方法?包含一个简短的代码示例来说明我的问题。FactoryBean

应用环境:

<bean id="searcher" class="some.package.SearcherFactory" /> 
<bean id="service" class="some.package.Service" /> 

工厂实施:

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;
    }
    .... 
}

工厂创建的类:

public class Searcher() {
      private Service service;

      @Autowired
      public void setService(Service service) {
           // never invoked
           this.service=service;
      } 
}

答案 1

下面是一个为您执行自动布线的抽象实现: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();

}

扩展它,实现 和 方法,您就可以启动并运行自动布线。getObjectType()doCreateInstance()

注意:不应用 BeanPostProcessor,这将需要额外的代码。


答案 2

由 创建的对象由 Spring 管理,但未由 Spring 实例化或配置。通过使用 ,您自己对此负责。所有注入和配置必须由FactoryBeanFactoryBeanFactoryBean

还有一种可能更适合您的替代方法 - 使用基于注释的配置而不是基于XML的配置。这意味着您可以在Java中拥有复杂的实例化逻辑,同时仍然在对象本身上使用类似的东西。@Autowired

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


推荐