什么是非范围bean以及何时使用它?

jch*_*jch 13 java jsf scope

有人可以解释什么是无范围和目的吗?

假设我有一个豆子

request scope as r1

session scope as s1

application scope a1
Run Code Online (Sandbox Code Playgroud)

并且说我没有将范围bean n1注入到上述每个范围中,然后我发现当实例化其父bean [r1/s1/a1]时,n1将被实例化为每个父bean.

a1中的无范围bean在a1中始终可用,因为a1是appl范围.s1中的无范围bean仅在s1未被销毁之后才可用,并且当再次创建s1时,n1将被实例化并且可用于它.

这是对的吗?

和使用它的目的是什么?只是为了避免创造这样的豆我们自己?

非常感谢

Bal*_*usC 20

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

例如,视图中的以下内容

<p>#{noneScopedBean.someProperty}</p>
<p>#{noneScopedBean.someProperty}</p>
<p>#{noneScopedBean.someProperty}</p>
Run Code Online (Sandbox Code Playgroud)

在一个无范围的bean上,在请求期间将构造 bean 3(三次).每次访问bean都会提供一个完全独立的bean,它在访问属性后立即被使用.

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

@ManagedProperty("#{noneScopedBean}")
private NoneScopedBean noneScopedBean;
Run Code Online (Sandbox Code Playgroud)

只要会话作用域bean实例,它将使它生效.您应该只确保在视图中访问它#{sessionScopedBean.noneScopedBean.someProperty}.

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


小智 7

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

我正在与Liferay合作,因为我想让我的架构和设计独立于liferay,我创建了我的服务接口和Dto,但是当你需要持久性数据时,Liferay需要从视图层发出companyId和companyGroupId(在这种情况下JSF).

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

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