从本质上讲,这两个类之间的区别是什么:
@ApplicationScoped
@Singleton
class A {}
@Dependent
@Singleton
class B {}
在查找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单例类上声明两个不同的范围。那有什么区别?