【问题标题】:Multiple Stateless Beans using same static method使用相同静态方法的多个无状态 Bean
【发布时间】:2012-05-02 02:53:59
【问题描述】:

我在使用无状态 EJB 时遇到了一个问题。我希望在那个 EJB 中应该使用一个特定的静态方法,但是这个方法非常重要并且它具有静态依赖关系。

正如我们所知,无状态会话 bean 的实例是根据需求(一个或多个)创建的。那么我如何确定所有的 EJB 都在使用该静态方法的一个副本。我不确定,但我认为每个使用静态方法的不同类都会加载不同的类副本,然后执行静态方法的不同副本。

而且我不能依赖单例 EJB,因为它不能保证只保留一份副本,因为如果服务器需要多个 JVM。不同的单例 EJB 副本将存在于不同的 JVM 中。

提前致谢。

【问题讨论】:

    标签: java static ejb


    【解决方案1】:

    每个类都有一个静态方法,即使您创建了该类的数千个实例,所有这些实例都只会看到您的静态方法的一份副本。

    现在根据规范,您的 EJB 中不应该有静态方法,如果您希望它是静态的,则应该考虑将其作为实用程序的一部分移动,或者使其成为非静态的。

    来自规范:

    EE.5.2.3 注释和注入

    如以下部分所述,特定的字段或方法 容器管理的组件类可以被注释以请求 将应用程序组件环境中的条目注入 班上。本章中描述的任何类型的资源都可以 被注入。也可以使用 对应于这些资源类型中的每一个的部署描述符。 字段或方法可以有任何访问限定符(public、private、 ETC。)。对于除应用程序客户端主类之外的所有类, 字段或方法不能是静态的。

    【讨论】:

    • 我想知道为什么它说它们“不能是静态的”。谁在乎它们是否是静态的?即使在标准 Java 中,静态方法也是一种害群之马:它是过程性的,而不是面向对象的,将它们放在哪里并不重要。程序员将静态方法组织到类中,但由于它们不对对象状态进行操作,因此选择有些随意。
    • 我最近了解到“它们一定不能是静态的”,因为静态方法不参与容器管理的事务、AOP、安全等。如果我们再问“为什么静态方法不参与AOP 等"我认为这与 EJB/CDI 如何使用代理完成其工作有关:代理通常通过实现接口或扩展类来实现,这对静态方法不起作用(类似于Mockito)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多