注入静态EJB,废话?

Cyr*_*don 12 java static annotations dependency-injection ejb-3.0

我想写这段代码:

@Stateless
public class MyEjb
{
    @EJB
    private static MyOtherEjbWhichIWantStatic myOtherEjb;
}
Run Code Online (Sandbox Code Playgroud)

我有意义的是,由于各种原因,我想在我的类中注入一个EJB作为静态元素.

遗憾的是,Java对此并不满意

com.sun.enterprise.container.common.spi.util.InjectionException: Illegal use of static field private static MyOtherEjbWhichIWantStatic myOtherEjb on class that only supports instance-based injection
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么我不能将静态EJB注入另一个EJB?

Pas*_*ent 27

正如其他人所指出的那样,规范不允许这样做,而简短的版本是@EJB只有具有main()函数的类中的静态成员才支持注释(请参阅EJB 3.0规范和app客户端容器).

为什么会这样?首先,EJB中完全禁止读/写静态字段(这是EJB限制的一部分).从为什么我不能在我的企业bean中使用非最终静态字段?

EJB中不允许使用非最终静态类字段,因为这些字段使企业bean难以或无法分发.静态类字段在特定类的所有实例之间共享,但仅在单个Java虚拟机(JVM)中共享.更新静态类字段意味着在类的所有实例之间共享字段值的意图.但是,如果一个类同时在多个JVM中运行,那么只有在与更新实例相同的JVM中运行的那些实例才能访问新值.换句话说,如果在单个JVM中运行,则非最终静态类字段的行为将与在多个JVM中运行时的行为不同.EJB容器保留了跨多个JVM(在同一服务器或任何服务器集群上运行)分发企业bean的选项.不允许使用非最终静态类字段,因为企业bean实例的行为会有所不同,具体取决于它们是否是分布式的.

如果将这些字段标记为,则可以使用静态类字段final.由于无法更新最终字段,因此容器可以分发企业bean的实例,而无需担心这些字段的值变得不同步.

但是,虽然允许使用只读静态字段,但这不适合EJB.可以合并无状态EJB,容器可以决定销毁它们(这是特定于实现的),并且您希望让容器选择您将要使用的实例,尤其是在分布式环境中.换句话说,永远不要假设您与特定实例绑定.

所以最后,是的,这是胡说八道.