将@Resource UserTransaction注入EJB Singleton bean是否安全

时间:2014-01-28 16:08:58

标签: java transactions ejb java-ee-6 java-ee-7

Q1: 我正在编写一个使用BMT的EJB Singleton bean,所以我需要在我的bean中使用UserTransaction。我想知道将ISRAN的@Resource UserTransaction注入我的EJB单例bean是非常安全的。我不知道容器是否会注入UserTransaction或NOT的代理。有人可以给我一些想法吗?谢谢!

Q2:

@Resource UserTransaction和sessionContext.getUserTransaction()之间有什么区别。它们是等价的吗?

1 个答案:

答案 0 :(得分:2)

  

我想知道将@Resource UserTransaction注入我的EJB单例bean是非常安全的。

Singleton会话bean是ejb3.1 specification中定义的三个bean之一:Stateless,Stateful和Singleton。  因此,对于Singleton,Container必须遵循与其他会话bean相同的合同。

合同说:

  

4.3.3 SessionContext接口。   如果bean指定了对SessionContext接口的依赖...,则容器必须提供会话   带有SessionContext的bean实例。这使会话bean实例能够访问容器维护的实例上下文。

  

@Resource UserTransaction和sessionContext.getUserTransaction()之间有什么区别。它们是等价的吗?

是的,他们是。这就是规范所说的:

  

4.3.2依赖注入。   在EJB 3.1 API下,bean类可以通过依赖注入获取SessionContext接口,而无需实现SessionBean接口。在这种情况下,Resource annotation(或resource-env-ref部署描述符元素)用于表示bean对SessionContext的依赖。

也许你的怀疑来自同一个Singleton实例可以由多个同时线程共享的事实, 它将共享相同的SessionContext实例。然而。这应该不是问题。 我使用条件表单,因为我没有尝试过,但除了可能出现的线程安全相关主题之外,请查看第117页的表格 明确指出必须支持使用UserTransaction方法

  

表3

     

单例会话Bean的方法中允许的操作:

     

Bean管理的事务划分:

     

SessionContext方法:UserTransaction方法