未添加注释时的默认 Java EE bean 类型

Default Java EE bean type when no annotation added

让我们考虑以下两个 class:

public class SomeInternal {
    public Integer someField;
}
public class SomeClass {
    private SomeInternal someInternal;

    @javax.inject.Inject
    public SomeClass(SomeInternal someInternal) {
        this.someInternal = someInternal;
    }
}

请注意 SomeInternal class 没有任何 @Singleton@Stateful@Stateless 注释。

这种bean的默认创建方法是什么?字段 someField 不为 class SomeInternal 添加 @Stateful 注释是否安全(例如,对 Web 应用程序的两个不同请求可能会修改同一字段)?

我知道 Spring 在这种情况下默认是 @Scope("Singleton"),但这与 Spring 无关。

提供标准 Java EE 6,或 Java EE 7,在 beans.xml 中带有显式 bean-discovery-mode="all"@Injected bean 的默认范围是 @Dependent。换句话说,它与正在 @Injected 的客户端实例完全相关,并且不会在其他任何地方共享。

这是一个 CDI 作用域,而不是 EJB 作用域。您似乎只是通过列出 EJB 范围而不是 CDI 范围来将 EJB 与 CDI 混合 @Dependent@RequestScoped@SessionScoped@ApplicationScoped 等。您至少可以说它看起来像 @Stateful,但没有 EJB 的事务管理魔法.

如果那些是 @Named 并且您在 EL 中引用它,那么您应该明确使用 #{someClass.someInternal.someField} 而不是 #{someInternal.someField} 来访问 @Injected @Dependent 作用域 bean .