【问题标题】:what scope of a bean before conversation.begin method is called在调用 conversation.begin 方法之前 bean 的范围是什么
【发布时间】:2014-03-16 15:16:51
【问题描述】:

我有一个 CDI bean:

@Named
@ConversationScoped
public class MyBean implements Serializable{
      @Inject
      private Conversation converstion;

      private void conversationBegin() {
          converstion.begin();
      }
}

我的问题是: 这个bean在conversationBegin()之前的作用域是什么?

【问题讨论】:

    标签: scope cdi


    【解决方案1】:

    我认为您对 CDI 的看法是错误的。

    您持有一个对 MyBean 类型的 bean 的 上下文引用。当您使用它时,一个上下文实例会被创建或从活动对话上下文中获取,并由您的上下文引用代理。

    范围没有变化。唯一会随着时间变化的是哪个上下文处于活动状态以及上下文中是否已经存在实例。

    【讨论】:

    • 那么,为什么我们需要调用converstion.begin()方法呢?干什么用的?
    • 我对 JSF 了解不多,但 CDI 1.0 对此是这么说的:""" 任何对话都处于以下两种状态之一:瞬态或长时间运行。默认情况下,一个对话是暂时的 可以通过调用 Conversation.begin() 将暂时的对话标记为长时间运行 I 可以通过调用 Conversation.end() 将长时间运行的对话标记为暂时的 ... """
    • “默认情况下,对话是暂时的”。不完全是,但我可以理解它就像 RequestScoped。那是我想问的。这也意味着:如果从未调用过 Conversation.begin() 方法,则该 bean 是 RequestScoped。你觉得怎么样?
    • 根据 CDI 规范,我认为这是公平的,因为在请求结束时会显式销毁临时对话。
    • 不,它仍然是 ConversationScoped,只是该上下文实例的长度(在本例中为会话上下文)恰好与 RequestScoped 对象的持续时间相同。如果将其视为 RequestScoped bean 会有所帮助,那很好,但您不能更改 Bean 的上下文(Bean 是 bean 的 CDI 定义)。
    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    相关资源
    最近更新 更多