JAVA EE CDI 范围、EJB 和托管 Bean 序列化

2023-11-29

对作用域、ejb 和托管 bean 有一些疑问。

  1. 范围(javax.enterprise.context.ApplicationScope、javax.enterprise.context.SessionScope)是否仅适用于 EJB?或者它们适用于所有托管 Bean?直到今天我还很确定它适用于所有托管豆。
  2. 在我的应用程序中,我们有:

    @ApplicationScoped
    public class MyClass implements MyNonSerializableInterface {
      @Inject  
      private transient NonSerializableLogger transientLogger;
      @Inject
      private NonSerializableLogger logger;
     ...
    }
    

    和一些经理:

    @Singleton
    public class SomeManager {
        @Inject private MyClass myClass;  
    
    }
    

    和网络服务:

    @Path("some")
    public class SomeWebService {
        @Inject private SomeManager;
    
    }
    

容器(部署时间)或编译器不会抱怨它,这正常吗?

我以为:

“使用会话、应用程序或对话范围的 Bean 必须是可序列化的,但使用请求范围的 Bean 不必是可序列化的。”JAVA EE 使用范围

MyClass 是否应该实现 Serialized?我们是否可以说,因为托管 bean 被注入到 @Singleton 中,所以序列化永远不会发生?因此在部署时不会显示序列化错误?

  1. 如果是:如果我创建 MyClass @ApplicationScoped 和 @Stateful 并使用 @EJB 将其注入 SomeManager 中,那么在部署时我确实会收到有关序列化的错误。
  2. 如果否:为什么我没有得到瞬态记录器的一些 NullPointerExceptions(由于钝化/激活)?

CDI 范围是在 CDI 容器的上下文中评估的。也就是说,CDI 规范的设计者确保它可以与 EJB 和 jsf Managed Bean 一起使用。就是这样说的。

  1. 理想情况下,CDI 范围是使用上下文敏感的。 @ApplicationScoped 意味着 CDI bean 从创建实例到应用程序结束都有效。它由 CDI 容器管理,与 EJB bean 完全无关。但由于与 EJB 的互操作性,它可以被注入 (@Inject) 到 EJB @Singleton bean 中。 EJB 规范和 CDI 规范都没有要求 @Singleton bean 或 @ApplicationScope bean 可序列化。由于这是一个应用程序范围的实例,因此不需要钝化。

  2. @SessionScope 使用当前容器希望的任何会话语义。例如,在 jsf 应用程序中,它的作用域通常为 HttpSession 的生命周期,但在没有 HttpSession 的 EJB 容器中,容器不会附加任何有意义的会话语义。它可能决定成为每个 @Stateless 事务或任何它希望的事务。由于会话可以序列化,因此规范通常要求 @SessionScoped beans 可序列化,但定义注入点的 bean(如果不是 @SessionScoped)则不需要可序列化。

  3. @RequestScope 还遵循“原子”操作的单次执行的语义,例如http请求。在Web容器中,它通常与HttpRequest相关联,并且不要求它是可序列化的。在非 Web 上下文中,它可以与每次调用相关联,甚至可以与事务边界相关联(在注入 EJB 的情况下),或者当无法归属有意义的作用域时,它将在注入点默认为 @Dependent 作用域。

也就是说,任何 CDI bean 都可以注入到任何 EJB bean 中。通常,在不与 Web 容器关联的 EJB 容器中,@Dependent 和 @ApplicationScope 是唯一具有任何有意义用途的作用域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA EE CDI 范围、EJB 和托管 Bean 序列化 的相关文章

随机推荐

  • 使用 CUSPARSE 时遇到问题

    当我想编译我的程序 使用 Cusparse 时 出现了以下几行 tmp tmpxft 00001048 00000000 13 matvec o 在函数中main tmpxft 00001048 00000000 1 matvec cuda
  • 如何在 Fortran 中抑制“已删除功能:暂停语句”的警告?

    我用谷歌搜索但找不到答案 我怎样才能抑制这个警告 并且只有这个 警告 删除的功能 1 处的 PAUSE 语句 我知道我可以抑制所有警告 但我只想抑制这一警告 或者如果不可能的话 抑制删除功能的警告 谢谢 A 使用 std legacy 或
  • 运行 Nuget 还原时出现 NU1202 错误

    我有一个 NET Framework 解决方案 正在尝试使用 Azure DevOps 上的管道进行设置 我在尝试恢复包时遇到错误 NU1202 Package AppCenter Analytics Metrics 1 1 0 is no
  • 如何在 Matplotlib 中选择 Y 轴上每个点之间的大小?

    我只是想使用 x 轴列表和 y 轴列表制作一个普通图表 但问题是 我希望能够选择 y 轴的大小 就像点之间的长度一样 我希望自己能够选择 例如 我的 y 轴叙述 0 2 5 5 7 5 等 我想将其更改为0 2 4 6 8 等 那么有没有办
  • Sql Server 2005 上的报告服务 2008

    我可以将 Reporting Services 2008 与 SQL Server 2005 数据库一起使用吗 我是否需要两个许可证 适用于 SQL Server 2008 和 SQL Server 2005 我是否需要两个实例 SQL S
  • 在java中编写哈希函数的最佳实践是什么?

    我想知道在 java 中编写 hashCode 方法的最佳实践是什么 可以找到很好的描述here 有那么好吗 这是引用自有效的Java第二版 第 9 项 始终覆盖hashCode当你覆盖equals 虽然本项中的配方产生了相当好的散列函数
  • Android通过firebase推送Notification(服务器端)

    我正在尝试使用 firebase 云消息传递系统从服务器向我的 Android 设备发送推送通知 我能够成功注册我的设备 并且也为我的设备生成了令牌 我无法使用以下脚本向我的设备发送通知
  • 使用 new 分配内存返回相同的内存地址

    class abc int x int main abc A new abc cout lt lt static cast
  • 当没有剩余内存时,.Net 和 Bitmap 不会被 GC 自动处理

    我想知道 NET 中为位图分配的内存的分配和处置是如何工作的 当我在函数中的循环中创建大量位图并连续调用它时 它将一直工作 直到某个时候位图无法分配内存 给出指定大小的 无效参数 异常 如果我在垃圾收集器工作时调用垃圾收集器 使用以下代码
  • 如何解码 BLE 广告数据

    扫描 BLE 设备后 我调用以下方法 void centralManager CBCentralManager central didDiscoverPeripheral CBPeripheral peripheral advertisem
  • 将两个日期之间的所有日期作为颤振日期范围选择器中的列表返回

    我只从 flutter date range picker 中得到两个日期 但我想要两个选定日期之间的日期列表 感谢您的回答 尝试以下操作 List
  • 如何使用同一应用程序查找附近的 iOS 设备(GPS 位置)

    我想创建一个应用程序 允许用户使用登录到同一应用程序的 GPS 坐标查找附近其他用户的位置 它还可以跟踪正在移动的设备 登录到同一应用程序 的位置在车里 有人能给我概述一下如何实现这一目标吗 有没有免费的 API 可以用来完成这个任务 Da
  • 如何将 png 与 alpha/透明度实时加入帧中

    我正在 OpenCV android 2 4 11 的示例下工作 它使用相机检测面部 我没有在找到的脸上画一个矩形 而是尝试在脸上放置一个遮罩 png 图像 但为了在脸上显示图像 png 图像带有黑色背景 其中有透明度 FdActivity
  • “CL.exe”退出,代码为-1073741515

    我使用的是 Windows 7 64 位机器 我下载了 VC 的 Express 版本和 Windows SDK 我需要在 64 位编译器中编译我的代码 编译时 我收到以下错误 CL exe 退出 代码为 1073741515 这个错误是什
  • 键盘覆盖了我视图底部的文本字段

    我已经搜索过 here 仅当键盘覆盖输入字段时向上移动视图 here 当键盘快速出现时移动文本字段 here 当键盘存在时如何使 UITextField 向上移动 和这里 https developer apple com library
  • Zend_Auth 最佳实践

    我的目标是要求某些页面登录 我正在使用 Zend Framework MVC 并且我正在尝试查找有关最佳实践的示例 关于我正在寻找的内容的一些注释 我希望未登录的用户获得登录框 然后在经过身份验证后返回到页面的登录版本 我想使用依赖注入 并
  • 如何将 LPCSTR 字符串转换为 LPCTSTR 字符串?

    我正在尝试转换LPCSTR串入LPCTSTR细绳 我想连接两个字符串 当我尝试这样时 LPCTSTR str1 L Raja LPCSTR str2 Kumar wcscat s str1 LPCTSTR str2 我发现像 Raja 这样
  • Matlab imshow 无法正确绘图,但 imshowpair 可以正确绘图

    我已经导入了图像 我已将其解析为双精度并对其进行了一些过滤 当我绘制结果时imshow 双像太暗 但是当我使用imshowpair绘制原始图像和最终图像 两个图像都正确显示 我尝试过使用uint8 im2uint8 乘以 255 然后使用这
  • 按位置从 data.table 中提取列作为向量

    如何按位置从 data table 中提取列作为向量 以下是我尝试过的一些代码片段 DT lt data table x c 1 2 y c 3 4 z c 5 6 DT x y z 1 1 3 5 2 2 4 6 我想使用列位置获得此输出
  • JAVA EE CDI 范围、EJB 和托管 Bean 序列化

    对作用域 ejb 和托管 bean 有一些疑问 范围 javax enterprise context ApplicationScope javax enterprise context SessionScope 是否仅适用于 EJB 或者