首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDI @RequestScoped bean生命周期

CDI @RequestScoped bean生命周期
EN

Stack Overflow用户
提问于 2014-10-23 04:22:43
回答 2查看 3.1K关注 0票数 1

我使用RequestScoped注释定义了CDI,如下所示。我有几个页面使用相同的bean。当我从一个页面导航到另一个页面时。bean obj保持不变。即使我更改了会话(使用不同的用户登录)。bean对象不会改变。

根据RequestScoped定义,应该为每个新请求重新创建bean实例。我错过什么了吗?

我使用的是JSF/Primefaces。导航到detail.xhtml页面后,可以看到从create.xhtml页面输入的值。在支持bean中,该值不会重新赋值。

谢谢,

张某

============================================================

import javax.enterprise.context.RequestScoped;

import javax.inject.Named;

@Named("targetManager")

@RequestScoped

public class TargetManager implements Serializable { }

======================================

create.xhtml:

代码语言:javascript
复制
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui" 
xmlns:f="http://java.sun.com/jsf/core" 
      template="../../templates/rapm.xhtml">

<ui:define name="contents">

<h:form id="createform">
  <h:outputLabel id="englishNameLabel">
     <h:outputText id="englishName" value="#{msg['view.label.englishname']}:" />
     <h:outputText id="englishNameStar" value="* " styleClass="mandatory" />
  </h:outputLabel>  
  <p:inputText id="englishTitle" value="#{targetManager.selectedTarget.englishName}" >
    <f:validator id="englishNameValidate1" validatorId="duplicateValidator" />
  </p:inputText>`

======================================

detail.xhtml:

代码语言:javascript
复制
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core"
  template="../../templates/rapm.xhtml">

  <ui:define name="contents">

  <p:scrollPanel id="scrollPanel" styleClass="contentPanel ntb" mode="native">

     <h:outputText id="englishName" value="#{msg['.view.label.englishname']}:"/>
       <h:outputText id="englishNameValue" value="#{targetManager.selectedTarget.englishName}" />

`

EN

回答 2

Stack Overflow用户

发布于 2014-10-23 18:03:08

CDI确实为每个请求创建了一个新对象,但不是为您的servlet或您正在使用的对象创建的。

假设您有一个servlet,那么servlet实例只创建一次,如果您将一个请求范围的bean注入到这个servlet中,那么CDI就不能在servlet中交换bean实例,因为这可能导致不可预知的状态。因此,CDI为servlet创建了一个代理实例,该实例在servlet存在期间始终保持不变。这就是为什么只获取bean实例的单个id的原因,您检索的是CDI代理对象的id,而不是底层bean的id。当新请求传入时,CDI会创建一个新的bean实例,并使用该bean为该特定请求支持代理。

票数 2
EN

Stack Overflow用户

发布于 2014-10-23 17:24:25

您可以通过输出创建时间来检查它是否已重新创建。您将看到它每次都输出不同的时间,这意味着每次请求时都会重新创建它。

代码语言:javascript
复制
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named("targetInstructionManager")
@RequestScoped
public class TargetInstructionManager implements Serializable { 
    public TargetInstructionManager (){
            System.out.println(System.currentTimeMillis());
        }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26516427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档