【问题标题】:what is none scope bean and when to use it?什么是无作用域 bean 以及何时使用它?
【发布时间】:2011-03-06 10:32:57
【问题描述】:

能否解释一下什么是 none 范围及其用途?

假设我有一个豆子

request scope as r1

session scope as s1

application scope a1

说我在上述每个作用域中都没有注入作用域 bean n1,然后我发现 n1 得到了 每次实例化父 bean[r1/s1/a1] 时为每个父 bean 实例化。

由于 a1 是 appl 范围,因此 a1 中的任何范围 bean 在 a1 中均不可用。 s1 中的无作用域 bean 仅在 s1 未被销毁和创建 s1 之前可用 n1 再次被实例化并可供它使用。

对吗?

以及使用它的目的是什么?只是为了避免我们自己创建这样的bean?

非常感谢

【问题讨论】:

  • 您从哪里了解到“无范围”?

标签: java jsf scope


【解决方案1】:

将在每个引用该 bean 的 EL 表达式上创建一个带有 <managed-bean-scope>none@NoneScoped 注释的 bean。它没有被 JSF 存储在任何地方。如有必要,调用者必须自己存储评估的引用。

例如视图中的以下内容

<p>#{noneScopedBean.someProperty}</p>
<p>#{noneScopedBean.someProperty}</p>
<p>#{noneScopedBean.someProperty}</p>

在非作用域的 bean 上,将在请求期间 构造 bean 3(三)次。对 bean 的每次访问都会提供一个完全独立的 bean,该 bean 在属性访问后立即被丢弃。

但是,例如会话范围的 bean 中的以下内容

@ManagedProperty("#{noneScopedBean}")
private NoneScopedBean noneScopedBean;

将使它与会话范围的 bean 实例一样长。您应该只确保您在视图中通过#{sessionScopedBean.noneScopedBean.someProperty} 访问它。

因此,当您希望无范围的数据可用作任意 bean 中的托管属性时,它可能会很有用。

【讨论】:

  • 我没有得到你提到的好处......请你详细说明一下......
  • @deadlus:巧合的是,我在发布答案后才开始玩弄它。抱歉,它没有像我预期的那样工作,我再也看不到任何好处了。
  • @BalusC "当您想在 faces-config.xml 中而不是直接在父 bean 本身中定义和声明托管属性时,此范围可能很有用。"父 bean 不允许通过注解声明托管属性的范围?
  • @BalusC “它还可以更轻松地控制更改托管属性的 bean 实现(如果声明为抽象/接口类型)。”它如何提供更多控制权?
【解决方案2】:

当我的“视图逻辑”不需要在任何范围内但被另一个 ManagedBean 引用时,我正在使用 @nonescoped。

我正在使用 Liferay,因为我想让我的架构和设计独立于 Liferay,我创建了我的服务接口和 Dto,但是当您需要持久化数据时,Liferay 需要从视图层(在本例中为 JSF)。

为了保持独立性,我做了一个“适配器模式”,使用@noneScope 创建了一个 ServiceLayer ManagedBean,其接口独立于 Liferay。这样我就可以得到 Liferay API 需要的 companyId 和 companyGroupId。

使用@noneScope 的优点是您可以在任何范围的任何bean 中将其用作@ManagedProperty。

【讨论】:

    【解决方案3】:

    @NoneScoped 在以下场景中会很有用。

    假设我们必须在两个不同作用域的 bean 中注入同一个 bean,我们可以将该 bean 标记为 @NoneScoped。假设一个带有@NoneScoped 的bean BeanOne 可以很容易地注入到任何具有@Request 或@Session 等范围的bean 中。

    如果不对 BeanOne 使用 @NoneScoped,我们可能必须复制具有不同范围的 bean 并相应地注入它们。

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 2016-11-21
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      相关资源
      最近更新 更多