@Dependent @ javax.ejb.Singleton与@ApplicationScoped @ javax.ejb.Singleton?

时间:2015-03-08 13:17:46

标签: java java-ee singleton cdi inject

从本质上讲,这两个类之间的区别是什么:

@ApplicationScoped
@Singleton
class A {}

@Dependent
@Singleton
class B {}

上下文EJB实例

在查找EJB时,我不想使用@Inject,除非EJB是@Stateful,我希望CDI容器管理有状态的生命周期,这可能非常方便。否则,使用@Inject检索上下文EJB实例有点危险。例如,除非我们还编写@Remote,否则无法使用CDI检索producer客户端视图。此外,A类和B类不能声明任何其他范围而不是它们目前的范围。 CDI 1.1,“3.2会话bean”部分说:

  

单例bean必须属于@ApplicationScoped范围或   到@Dependent伪范围。如果会话bean指定非法   范围,容器自动检测问题并对其进行处理   作为定义错误。

因此,除了有状态bean之外,当我去寻找EJB时,我认为使用CDI毫无意义:

问题的更成熟版本

从客户端代码的角度来看,使用@Inject声明对A或B的依赖,我无法想象存在差异。在这两种情况下,调用路由到单例EJB。如果我是CDI提供程序的实现作者,那么我甚至可能在这两种情况下注入真正的EJB代理并忽略将来要求销毁依赖CDI代理的调用?底线是我们可以在EJB单例类上声明两个不同的范围。那有什么区别?

0 个答案:

没有答案