Q1: 我正在编写一个使用BMT的EJB Singleton bean,所以我需要在我的bean中使用UserTransaction。我想知道将ISRAN的@Resource UserTransaction注入我的EJB单例bean是非常安全的。我不知道容器是否会注入UserTransaction或NOT的代理。有人可以给我一些想法吗?谢谢!
Q2:
@Resource UserTransaction和sessionContext.getUserTransaction()之间有什么区别。它们是等价的吗?
答案 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方法