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实现。它如何给予更多的控制?