2015-08-28 52 views
0

让我们考虑以下两类:默认Java EE Bean类型时,没有标注添加

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

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

注意SomeInternal类没有任何的@Singleton@Stateful@Stateless注解。

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

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

回答

0

提供的标准Java EE 6或Java EE 7的bean-discovery-mode="all"beans.xml中,@Inject ed bean的默认范围是@Dependent。换句话说,它与客户端实例绑定在一起,它在@Inject ed中,并且它不在其他地方共享。

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

如果这些都@Named和你引用它在EL,那么你应该明确地使用#{someClass.someInternal.someField}代替#{someInternal.someField}访问的@Inject@Dependent作用域bean。

相关问题