未添加注释时的默认 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"
,@Inject
ed bean 的默认范围是 @Dependent
。换句话说,它与正在 @Inject
ed 的客户端实例完全相关,并且不会在其他任何地方共享。
这是一个 CDI 作用域,而不是 EJB 作用域。您似乎只是通过列出 EJB 范围而不是 CDI 范围来将 EJB 与 CDI 混合 @Dependent
、@RequestScoped
、@SessionScoped
、@ApplicationScoped
等。您至少可以说它看起来像 @Stateful
,但没有 EJB 的事务管理魔法.
如果那些是 @Named
并且您在 EL 中引用它,那么您应该明确使用 #{someClass.someInternal.someField}
而不是 #{someInternal.someField}
来访问 @Inject
ed @Dependent
作用域 bean .
让我们考虑以下两个 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"
,@Inject
ed bean 的默认范围是 @Dependent
。换句话说,它与正在 @Inject
ed 的客户端实例完全相关,并且不会在其他任何地方共享。
这是一个 CDI 作用域,而不是 EJB 作用域。您似乎只是通过列出 EJB 范围而不是 CDI 范围来将 EJB 与 CDI 混合 @Dependent
、@RequestScoped
、@SessionScoped
、@ApplicationScoped
等。您至少可以说它看起来像 @Stateful
,但没有 EJB 的事务管理魔法.
如果那些是 @Named
并且您在 EL 中引用它,那么您应该明确使用 #{someClass.someInternal.someField}
而不是 #{someInternal.someField}
来访问 @Inject
ed @Dependent
作用域 bean .