MessageDrivenBean 中的 finalize 方法
finalize method in MessageDrivenBean
the requirements of a message-driven bean class:
It must not define the finalize method.
以上要求的原因是什么?
如果查看 EJB 规范,您会发现它是对所有类型的 EJB 的要求。
http://download.oracle.com/otndocs/jcp/ejb-3.1-pfd-oth-JSpec/
我找不到明确的答案,但在过去 13 年的各种 Java 论坛上,您可以看到答案一致地说,因为容器将决定 EJB 的生命周期, finalize 可能永远不会被调用(或在您不期望的时候被调用)并且使用它会很危险。
原因是 bean 生命周期由容器(EJB、CDI 或不同的容器)管理,因此您应该使用带有 @PreDestroy
注释的方法在将要处理 bean 时进行清理.请记住,JVM 不保证在对象处理期间调用 finalize
,因此即使在 Java SE 环境中也不应使用它(Java 没有像 C++ 中那样的析构函数的概念)。
MDB 不会被垃圾回收,除非它失败了服务器中配置的次数。因此,可能根本不会调用此方法,因为 MDB 汇集在 MDB 池中并仅在需要时重用。由于 finalize 方法由 GC 调用,因此您不应该在 MDB 中定义它是合理的,因为它的所有生命周期都由 EJB 容器管理。如果您重写该方法,您将不会得到任何异常,因为它已经从 Object class 继承,但无法预测何时调用其中的代码。此外,访问 MDB 中的任何资源都为时已晚,因为 EJB 容器已经完成了关闭连接等清理工作
the requirements of a message-driven bean class:
It must not define the finalize method.
以上要求的原因是什么?
如果查看 EJB 规范,您会发现它是对所有类型的 EJB 的要求。
http://download.oracle.com/otndocs/jcp/ejb-3.1-pfd-oth-JSpec/
我找不到明确的答案,但在过去 13 年的各种 Java 论坛上,您可以看到答案一致地说,因为容器将决定 EJB 的生命周期, finalize 可能永远不会被调用(或在您不期望的时候被调用)并且使用它会很危险。
原因是 bean 生命周期由容器(EJB、CDI 或不同的容器)管理,因此您应该使用带有 @PreDestroy
注释的方法在将要处理 bean 时进行清理.请记住,JVM 不保证在对象处理期间调用 finalize
,因此即使在 Java SE 环境中也不应使用它(Java 没有像 C++ 中那样的析构函数的概念)。
MDB 不会被垃圾回收,除非它失败了服务器中配置的次数。因此,可能根本不会调用此方法,因为 MDB 汇集在 MDB 池中并仅在需要时重用。由于 finalize 方法由 GC 调用,因此您不应该在 MDB 中定义它是合理的,因为它的所有生命周期都由 EJB 容器管理。如果您重写该方法,您将不会得到任何异常,因为它已经从 Object class 继承,但无法预测何时调用其中的代码。此外,访问 MDB 中的任何资源都为时已晚,因为 EJB 容器已经完成了关闭连接等清理工作