Spring FactoryBean和范围一起工作

TTa*_*Tar 8 java spring

我想将FactoryBeans和范围一起使用.具体来说,我希望FactoryBean创建并返回的对象放在指定的(可能是自定义的)范围内.问题是执行以下操作:

<bean class="x.y.z.TestFactoryBean" scope="test" />
Run Code Online (Sandbox Code Playgroud)

FactoryBean本身的结果是作用域,并且对工厂创建的对象有一些不可预测的行为.我明白为什么会这样; 工厂本身是一流的春季管理的豆,并有自己的生命周期.但是,我找不到一种方法来指定从工厂返回的对象本身应该作用域.

另一方面,这正是我想要的(只要TestFactoryBean不实现FactoryBean接口):

<bean class="x.y.z.TestFactoryBean" name="testFactory">
<bean class="x.y.z.TestBean" factory-bean="testFactory" 
      factory-method="getObject" scope="test" />
Run Code Online (Sandbox Code Playgroud)

所以真正的问题是,我如何使Spring的行为与上面的第二个例子一样,但是使用真正的FactoryBeans?

Esp*_*pen 6

您无法在从a返回的bean上轻松使用自定义作用域FactoryBean.

从Spring的Java文档:

FactoryBeans可以支持单例和原型

如果您希望FactoryBean返回的bean具有原型范围,那么您必须实现如下isSingleton()方法:

public class TestFactoryBean implements FactoryBean<TestBean> {

  // the rest of the required methods are removed for simplicity reasons..

  public boolean isSingleton() {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

要支持自定义范围,您必须自己实现逻辑,并且它不会非常直观,因为FactoryBean它只提供了isSingleton()方法.我宁愿推荐使用另一种解决方案,而不是FactoryBean使用自定义范围的bean.

希望这可以帮助!