什么是无范围豆,何时使用它?

2022-09-04 07:30:40

有人能解释一下什么是无范围及其目的吗?

假设我有一个豆子

request scope as r1

session scope as s1

application scope a1

并假设我没有将任何范围bean n1注入上述每个范围,然后我发现n1在实例化其父bean[r1 / s1 / a1]时为每个父bean实例化。

a1 中没有任何作用域 Bean 在 a1 中可用,因为 a1 是 appl 作用域。s1 中没有作用域 Bean 仅在 s1 未被销毁之前可用,并且当再次创建 s1 时,n1 将被实例化并使其可用。

这是正确的吗?

使用它的目的是什么?只是为了避免创造这样的豆子吗?

非常感谢


答案 1

将在引用该 bean 的每个 EL 表达式上创建具有 of 或 @NoneScoped 注释的 bean。JSF 不会将其存储在任何地方。如有必要,调用方必须存储已评估的引用本身。<managed-bean-scope>none

例如,视图中的以下内容

<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 中的托管属性时,它可能很有用。


答案 2

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

我正在与Liferay合作,因为我想让我的架构和设计独立于liferay,我创建我的服务接口和Dto,但是当你需要持久化数据时,Liferay需要从视图层发送companyId和companyGroupId(在本例中为JSF)。

为了保持独立性,我做了一个“适配器模式”,创建了一个带有@noneScope的ServiceLayer ManagedBean,其接口独立于Liferay。通过这种方式,我可以获得Liferay Apis所需的companyId和companyGroupId。

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