Мне было интересно, БЕЗОПАСНО ли вводить @Resource UserTransaction в мой одноэлементный компонент EJB.
Сеансовый компонент Singleton — это один из трех компонентов, определенных в спецификации ejb3.1. : без гражданства, с сохранением состояния и синглтон. Следовательно, с Singleton контейнер должен следовать тому же контракту, что и другие сеансовые компоненты.
В договоре сказано:
4.3.3 Интерфейс SessionContext. Если компонент указывает зависимость от интерфейса SessionContext..., контейнер должен предоставить экземпляр сеансового компонента с SessionContext. Это дает экземпляру сеансового компонента доступ к контексту экземпляра, поддерживаемому контейнером.
.
В чем разница между @Resource UserTransaction и sessionContext.getUserTransaction(). Они эквивалентны?
Да, они. Вот что говорит спецификация:
4.3.2 Внедрение зависимостей. В EJB 3.1 API класс компонента может получить интерфейс SessionContext посредством внедрения зависимостей без необходимости реализации интерфейса SessionBean. В этом случае аннотация Resource (или элемент дескриптора развертывания resource-env-ref) используется для обозначения зависимости bean-компонента от SessionContext.
Возможно, ваши сомнения вызваны тем фактом, что один и тот же экземпляр Singleton может совместно использоваться несколькими одновременными потоками, которые будут совместно использовать один и тот же экземпляр SessionContext. Однако. это не должно быть проблемой. Я использую условную форму, потому что не пробовал ее, но помимо темы, связанной с потокобезопасностью, которая может возникнуть, взгляните на таблицу на странице 117, где явно указано, что использование метода UserTransaction должно поддерживаться.
Таблица 3
Операции, разрешенные в методах Singleton Session Bean:
Разграничение транзакций, управляемых компонентом:
Методы SessionContext: методы UserTransaction
person
Gabriel Aramburu
schedule
28.01.2014