java - Spring FactoryBean 和作用域协同工作

标签 java spring

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

<bean class="x.y.z.TestFactoryBean" scope="test" />

导致 FactoryBean 本身被限定范围,并且对工厂创建的对象具有某种不可预测的行为。我明白这是为什么;工厂本身是一流的 spring 管理的 bean,并且有自己的生命周期。但是,我找不到一种方法来指定从工厂返回的对象本身应该在范围内。

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

<bean class="x.y.z.TestFactoryBean" name="testFactory">
<bean class="x.y.z.TestBean" factory-bean="testFactory" 
      factory-method="getObject" scope="test" />

所以真正的问题是,我怎样才能使 Spring 像上面第二个示例一样运行,但使用真正的 FactoryBeans?

最佳答案

您不能轻易地在从 FactoryBean 返回的 bean 上使用自定义作用域。

来自 Spring 的 Java documentation :

FactoryBeans can support singletons and prototypes

如果您希望FactoryBean 的返回bean 具有原型(prototype)作用域,那么您必须像这样实现isSingleton() 方法:

public class TestFactoryBean implements FactoryBean<TestBean> {

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

  public boolean isSingleton() {
        return false;
    }
}

要支持自定义作用域,您必须自己实现逻辑,这不会很直观,因为 FactoryBean 只提供了 isSingleton() 方法。对于具有自定义作用域的 bean,我宁愿推荐使用不同于 FactoryBean 的另一种解决方案。

希望这对您有所帮助!

关于java - Spring FactoryBean 和作用域协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2830337/

相关文章:

java - 更改 NatTable 中选定行的颜色

java - Spring上下文编译时验证

spring - 无法使用 Spring Websocket STOMP 发送特定于用户的消息

java - 在 Apache spark 中,使用 mapPartitions 和结合使用广播变量和映射有什么区别

java - 非常简单的 Android 应用程序中的内存泄漏

java - Android Studio 导致应用程序接收致命信号 6 (SIGABRT),代码 -6 (SI_TKILL)

java - 从堆栈中删除方法调用

java - Spring JPA 中的 @OneToOne 映射是什么?

java - 在 Threads 中访问作用域代理 bean

java - 当通过关联链接访问时,为什么实体包含在 Spring Data REST 的内容对象中?