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

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

@ApplicationScoped @Singleton class A {} @Dependent @Singleton class B {} 

上下文EJB实例

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

单例bean必须属于@ApplicationScoped范围或@Dependent伪范围。 如果会话bean指定了非法范围,容器会自动检测问题并将其视为定义错误。

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

一个更成熟的问题版本

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