Java 什么是无作用域bean以及何时使用它?

Java 什么是无作用域bean以及何时使用它?,java,jsf,scope,Java,Jsf,Scope,有人能解释什么是无范围以及它的目的吗 假设我有一颗豆子在里面 request scope as r1 session scope as s1 application scope a1 假设我将none-scopebean n1注入上述每个作用域,那么我发现n1得到 当其父bean[r1/s1/a1]被实例化时,为每个父bean实例化 a1中没有作用域bean在a1中始终可用,因为a1是appl作用域。 只有在s1未被销毁和s1被创建之前,s1中的作用域bean都不可用 再次实例化n1并使其

有人能解释什么是无范围以及它的目的吗

假设我有一颗豆子在里面

request scope as r1

session scope as s1

application scope a1
假设我将none-scopebean n1注入上述每个作用域,那么我发现n1得到 当其父bean[r1/s1/a1]被实例化时,为每个父bean实例化

a1中没有作用域bean在a1中始终可用,因为a1是appl作用域。 只有在s1未被销毁和s1被创建之前,s1中的作用域bean都不可用 再次实例化n1并使其可用

对吗

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

非常感谢

将在引用该bean的每个EL表达式上创建一个带有none或注释的bean。它没有被JSF存储在任何地方。如有必要,调用方必须存储已计算的引用本身

例如,视图中的以下内容

{noneScopedBean.someProperty}

{noneScopedBean.someProperty}

{noneScopedBean.someProperty}

在一个无作用域的bean上,它将在一个请求期间构造bean 3次。对bean的每次访问都会产生一个完全独立的bean,该bean在属性访问之后立即被丢弃

但是,下面的示例是会话范围的bean

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


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

当我的视图逻辑不需要在任何作用域中,而是由另一个ManagedBean引用时,我使用@NonScoped

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

为了保持独立性,我使用@noneScope创建了一个ServiceLayer ManagedBean,该ServiceLayer ManagedBean具有独立于Liferay的接口。这样我就可以获得Liferay API所需的companyId和companyGroupId


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

@NoneScoped在以下场景中是有益的

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


如果不使用@NoneScoped for BeanOne,我们可能必须用不同的作用域复制bean并相应地注入它们。

你在哪里读到了关于none-scope的内容?我没有得到你提到的好处……请你详细说明一下……deadlus:巧合的是,我在发布答案后才开始玩它。很抱歉,它没有像我预期的那样工作,我再也看不到任何好处。@BalusC当您想在faces-config.xml中定义和声明托管属性而不是直接在父bean中定义和声明托管属性时,此作用域可能会很有用。父bean不允许通过annotation?@BalusC声明托管属性的范围。如果将托管属性声明为抽象/接口类型,它还可以更轻松地控制更改托管属性的bean实现。它如何给予更多的控制?