【问题标题】:Is there such a thing as a "local" scoped bean in CDI?CDI 中是否存在“本地”作用域 bean 之类的东西?
【发布时间】:2016-03-15 13:17:38
【问题描述】:

“本地”是指在方法调用期间创建和销毁 bean。这与调用构造函数基本相同,优点是能够在该 bean 的字段中使用 @Inject。

我为什么要这样做
我正在重构使用 CDI 的遗留代码。我想extract very long methods into classes。方法中的局部变量将被类中的字段替换,因此 bean 将具有仅属于该短期范围(方法调用的持续时间)的状态。 bean 还将依赖于服务和其他范围更广的 bean,我宁愿注入也不愿将长参数列表传递给构造函数。

【问题讨论】:

  • 如果你重构类,你可以把它们变成一个“无状态”的应用程序范围的bean,这样你就不需要考虑这么窄的范围

标签: dependency-injection cdi


【解决方案1】:

CDI 不支持方法注入(除了设置器和构造器)。所以这不能做到,因为@Dependent 作用域依赖于包含的 bean 而不是调用者方法。

在您的情况下,即使这有效,它也会产生无限循环,因为您需要将容器传递给子节点,然后将子节点传递给容器,依此类推。

解决方案是注入工厂。

【讨论】:

    【解决方案2】:

    考虑到标准 CDI 范围,@RequestScoped 可能最适合您的短期 bean,即使它们的生命周期比单个方法调用更长。

    无状态 @ApplicationScoped bean(例如服务)可以并行处理任意数量的 @RequestScoped bean(例如命令)。

    如果这不适合您,您始终可以使用 CDI 扩展定义自定义范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2010-09-24
      相关资源
      最近更新 更多