当前位置: 首页 > 知识库问答 >
问题:

CDI@RequestScoped bean生命周期

喻增
2023-03-14

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

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

我正在使用JSF/Primefaces。从create输入的值。导航到详细信息后可以看到xhtml页面。xhtml页面。在backingbean中,不会重新分配该值。

谢谢

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

导入javax。企业上下文请求范围

导入javax。注射命名的

@Named(“targetManager”)

@请求范围

公共类TargetManager实现可序列化{}

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

create。xhtml:

<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>`

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

细节。xhtml:

<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}" />

'

共有2个答案

通煜祺
2023-03-14

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

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named("targetInstructionManager")
@RequestScoped
public class TargetInstructionManager implements Serializable { 
    public TargetInstructionManager (){
            System.out.println(System.currentTimeMillis());
        }
}
曾英睿
2023-03-14

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

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

 类似资料:
  • 视图和bean一直在工作,直到我试图修复非标准名称,现在我已经打破了两者之间的连接。奇怪的是,“返回”按钮有正确的链接,但内容就是不显示,也不记录。为什么不执行Detail.get注释()? 我一直在浏览焊接文档,并试图更好地理解@Inject。似乎有一个我也不明白的生命周期问题。如果它不是生命周期,那么我甚至不能推测为什么Detail.get注释()从未在glassfish日志中显示: 值200

  • 注:本文档提供的生命周期指的是 Universal App 的生命周期,它依赖 rax-app 提供的 runApp方法。 App 级生命周期 launch  在 App 启动时触发 使用生命周期 你可以使用 rax-app 提供的 useAppLaunch 来注册 App 级别的生命周期。 示例: import { useAppLaunch } from 'rax-app'; useAppLa

  • 我们大致为WebAPplication设计了4个生命周期: 请求初始化其实就是从URL中解析提取出{module}, {action}, {method}; 然后再根据{module}, {action}, {method}找到对应的Controller文件; 然后再调用对应的{method},完了之后再发送响应。当然响应的过程中肯定是要顺带着解析下模板标签啦。 恩,这就完了,貌似感觉很简单啊。

  • 如下图. 可以看出,基本周期是: created mounted updated (update 可以理解成人肉手动操作触发) destroyed 上面步骤中的 1,3,4都是自动触发。 每个步骤都有对应的 beforeXyz方法 所以, 我们一般使用mounted 作为页面初始化时执行的方法

  • 概览 组件的生命周期分为三个阶段:挂载、渲染、卸载,下图展示了解组件在整个生命周期中所涉及到的方法调用、原型方法调用和状态变化。 挂载阶段 从组件实例被创建再到被插入根组件树中,所经历的操作如下: 初始化组件实例。 根据组件类型绑定对应的原型。 调用 proto->init() 原型方法。 标记组件需要刷新全部样式。 因父组件变为另外一个组件,触发 link 事件。 更新阶段 当组件被插入到根组件

  • 框架生命周期 Hyperf 是运行于 Swoole 之上的,想要理解透彻 Hyperf 的生命周期,那么理解 Swoole 的生命周期也至关重要。 Hyperf 的命令管理默认由 symfony/console 提供支持(如果您希望更换该组件您也可以通过改变 skeleton 的入口文件更换成您希望使用的组件),在执行 php bin/hyperf.php start 后,将由 Hyperf\Se