JSF 2 应用程序中的默认托管 Bean 范围是啥?

Posted

技术标签:

【中文标题】JSF 2 应用程序中的默认托管 Bean 范围是啥?【英文标题】:What is the default Managed Bean Scope in a JSF 2 application?JSF 2 应用程序中的默认托管 Bean 范围是什么? 【发布时间】:2013-10-19 18:47:44 【问题描述】:

通常默认范围是请求范围。我试图删除范围注释并期望 bean 具有请求 bean 范围行为(通过在前一页上返回提交的值,我记得我过去尝试过这个并且它工作正常)但我什么也没得到连接到它的表达语言。 那么默认范围是什么,为什么它的行为不一样?!

【问题讨论】:

【参考方案1】:

取决于谁在管理 bean。

如果是 JSF via @ManagedBean,则默认为@RequestScoped,如javadoc 中所述:

如果省略范围注释,则必须像存在 RequestScoped 注释一样处理 bean

如果是通过@NamedCDI,则默认为@Dependent,如Weld documentation 中所述:

最后,CDI 具有所谓的依赖伪作用域。这是未显式声​​明作用域类型的 bean 的默认作用域。

效果是在每个 EL 表达式上新创建了 bean 实例。因此,想象一个登录表单,其中有两个输入字段引用一个 bean 属性和一个命令按钮引用一个 bean 操作,因此总共有三个 EL 表达式,那么实际上将创建三个实例。一个设置了用户名,一个设置了密码,一个设置了操作。实际上,这与 JSF @NoneScoped 的行为相同。这证实了您所看到的症状。

如果是Spring via @Component,则默认为@Scope("singleton"),如javadoc中所述:

默认:"singleton"

实际上,这与 JSF @ApplicationScoped 和 CDI @ApplicationScoped 的行为相同。

Netbeans 与此无关。它只是一个类似于记事本的编辑工具,但具有 1000 多个额外功能。

另见:

what is none scope bean and when to use it? How to choose the right bean scope?

【讨论】:

@BalusC 我很困惑......你说 ManagedBean 的默认范围是 NoneScoped,但文档说它是 RequestScoped:“如果省略范围注释,则必须像处理存在 RequestScoped 注释”docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedBean.html 但是,我在this link 中看到了几个文档说“@Dependent scoped bean,继承他们注入的 bean 的范围”,所以如果注入的 bean 有一个会话范围,则不会为每个 EL 生成单独的 bean。 @NPE:如果您直接在 EL 中引用它,就像在 #dependentScopedBean 中一样,而不是像在 #sessionScopedBean.dependentScopedBean 中那样作为会话范围 bean 的属性,那将是。

以上是关于JSF 2 应用程序中的默认托管 Bean 范围是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将 JSF 托管 bean 迁移到 CDI 托管 bean

如何以编程方式注册 JSF 托管 bean?

如何(以及何时?)在 JSF 2.0 中删除 Session 范围的 bean

在 Web 过滤器中访问会话范围的 JSF 托管 bean

从视图范围的托管 bean JSF 填充数据表

托管 bean 问题中的用户输入验证(JSF 2.0)