这是我的另一个问题的补充,我不明白“范围”是如何在Java-EE中起作用的。事实上,关于EJB和CBI的术语“范围”和“会话”似乎完全混淆了。
但忽略了令人困惑的条款,实际发生了什么? 例如,假设我们在Web层中有一个servlet。我们可能希望有一个有状态EJB来保存信息:1)整个HTTP会话由来回请求组成2)单个HTTP请求,尽管servlet可以为同一个请求多次调用EJB方法,所以尽管只有一个HTTP请求,我们仍然需要一个有状态bean来在多次调用之间保持状态。等等其他类型...
我的问题是,CDI似乎提供了这些选项,但是在CDI之前,现在如果不使用CDI,EJB是如何处理会话范围和请求范围之间的差异的呢?术语会话bean似乎具有误导性,因为它们似乎没有引用http会话。实际上,似乎“有状态”实际上可以与http会话绑定。
如果我理解正确,CDI容器通过使用cookie或其他回退方法来跟踪HTTP会话,这就是它如何知道何时销毁会话范围bean,EJB容器是否也跟踪http会话?或者他们都使用相同的管道来跟踪会话? 在这个高度混乱的领域,任何见解都非常受欢迎,
由于
答案 0 :(得分:4)
实际上术语如"范围"和"会话"用于 EJB和CBI似乎完全混淆了。
是的,术语"会话"在EJB和servlet之间重载。对于EJB,会话的持续时间"在方法级别:你要调用的bean实例是"无状态会话bean",即使同一个客户端调用它也不记得状态,或者"有状态会话bean",它为每个客户端提供自己的bean实例,直到它超时或显式删除为止。 (或者是EJB 3.1中的单例。)对于servlet," session"始终意味着存储状态的东西,通常由cookie标识,以便它可以持久存储多个请求。正如您所说,有状态会话bean即使在单个Web请求中也可能有用,无论是否有servlet会话。
CDI似乎提供了这些选项,但是在CDI之前,现在如果 不使用CDI,EJB如何处理a之间的区别 会话范围和请求范围?
EJB"请求范围"将是无状态会话bean:每次调用EJB方法时都会获得一个新实例。 EJB没有" servlet会话范围"的概念。最接近的是创建一个有状态会话bean并自己将它存储在HttpSession中。
CDI范围是两件事:代理调解对实际bean实例的访问,以便"神奇地"对作用域对象进行操作,以及获取/设置作用域状态的机制。对于@SessionScoped @Stateful
,这意味着CDI正在进行繁琐的工作:它在您第一次使用代理时创建有状态bean,它将实例存储在HttpSession中,并且它使用HttpSession注册一个侦听器,以便它可以破坏它HttpSession结束时有状态bean。