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

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

假设我有一个豆子

request scope as r1 session scope as s1 application scope a1 

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

a1中的无范围bean在a1中始终可用,因为a1是appl范围。 s1中的无范围bean只有在s1未被销毁且s1再次创建时才可用,n1将被实例化并可供其使用。

这是对的吗?

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

非常感谢

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

例如,视图中的以下内容

 

#{noneScopedBean.someProperty}

#{noneScopedBean.someProperty}

#{noneScopedBean.someProperty}

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

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

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

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

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

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

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

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

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

@NoneScoped在以下场景中会有所帮助。

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

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