Что делает аннотация @EJB?
Я знаю примерно то, что делает эта конструкция: он создает SomeType EJB и вводит объект в другой EJB.
@EJB(name="name1")
SomeType someVariable
Теперь у меня есть класс, который начинается следующим образом: (Я даю все аннотации на уровне класса, хотя я думаю, что релевантно только @EJBs
)
@Remote(SomeClass.class)
@Stateless(name="someName")
@EJBs({@EJB(name="name1",beanInterface=Type1.class),
@EJB(name="name2",beanInterface=Type2.class)})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class X extends Y{
//code
Что здесь делает @EJB
? Они, вероятно, получают или создают объекты "name1"... из JNDI, но где они помещают результат? Я не вижу вызова .lookup
поблизости, но база кода огромна, поэтому я не очень уверен в этом.
Бонусный вопрос: я предполагаю, что две аннотации @Transaction
просто повторяют значения по умолчанию?
ОБНОВЛЕНИЕ: несколько человек заявили в этот момент, что @EJBs
является проприетарным расширением. Это не. Это основная часть java EE5. Подробнее см. JavaDoc.. Это просто контейнер для индивидуальных аннотаций @EJB
.
Я считаю, что все, кто утверждает эти аннотации EJB, ищут. Я просто хочу знать, что происходит с результатом этого поиска.
Ответы
Ответ 1
Аннотация @EJB
(и @Resource
, @WebServiceRef
и т.д.) служит двум целям:
- Он объявляет ссылку в пространстве имен компонентов. Например,
@EJB(name="myEJB")
создает ссылку java:comp/env/myEJB
. Если вы аннотируете поле и не указываете имя, тогда он создает ссылку java:comp/env/com.example.MyClass/myField
.
- Если аннотация объявлена методом поля или сеттера, тогда контейнер выполняет инъекцию, когда компонент создается.
Как разрешается ссылка, зависит от того, разрешена ли ссылка для lookup("java:comp/env/myEJB")
или из-за инъекции:
- Если используется EE 6+, атрибут
lookup
требует поиска JNDI для решения задачи.
- Некоторые серверы приложений поддерживают
mappedName
, который указан как специфический для поставщика. Обычно это выполняется путем выполнения поиска.
- Серверы приложений поддерживают привязки во время развертывания. Обычно это выполняется путем выполнения поиска.
- Если никакая другая информация привязки не предоставляется, а интерфейс bean (
beanInterface
или тип поля) реализуется только одним EJB в приложении, тогда спецификация EJB требует, чтобы он вернулся к этому.
- Если никакая другая информация привязки не предоставлена, а # 4 не может работать, некоторые серверы приложений будут пытаться выполнить поиск в пространстве имен сервера на основе имени ссылки (например,
java:comp/env/myEJB
может вызвать поиск myEJB
в пространство имен сервера).
Ответ 2
Ответ на вопрос Миджена Микика дал мне представление о возможном ответе. Если кто-нибудь, кто знает о JNDI, читает это, скажите мне, если это разумно, поскольку я в основном предполагаю здесь.
В принципе, есть два способа взглянуть на дерево JNDI: либо через глобальный путь (/some/proprietary/path/my/ bean), либо через вашу программную среду (java: comp/env/my/bean). Идея состоит в том, что вы создаете ссылки из глобального пути к вашей локальной среде, а затем просматриваете компоненты оттуда.
Итак, @Ejb (name= "java: comp/env/my/ bean", mappedName = "/some/proprietary/path/my/bean" ) создаст эту ссылку из java-кода (без дескриптор xml файла).
Это означает, что @Ejb (name= "java: comp/env/my/ bean" ) само по себе не работает: он копирует ссылку на себя. Это может быть связано с тем, что сервер приложений теперь знает во время компиляции, что эта ссылка требуется, но об этом.
Ответ 3
В соответствии с этой ссылкой в основном эта аннотация позволяет EJB искать внешние EJB относительно своего контекста. Обычно есть более элегантные способы сделать это.
Ответ 4
Что касается вопроса о бонусе: Да, две аннотации относительно транзакций повторяют значения по умолчанию: По умолчанию TransactionManagementType - CONTAINER (vs BEAN), а значение по умолчанию - TransactionAttributeType REQUIRED просто указывает, что если bean вызывается внутри транзакционный контекст транзакция продолжается, в противном случае будет инициирована новая транзакция (в отличие от, например, REQUIRES_NEW, которая всегда будет создавать новый tx). Это на самом деле подробно не так тривиально, как кажется Cf. спецификация EJB 3.1:
"13.3.7 Спецификация атрибутов транзакции для методов Bean
Поставщик bean предприятия bean с демаркацией транзакций с контейнером может указывать
атрибуты транзакции для методов предприятия Bean. По умолчанию значение транзакции
атрибут для метода bean с демаркацией транзакций, управляемых контейнером, является ТРЕБУЕМЫМ
атрибут транзакции и атрибут транзакции не должны быть явно указаны в этом случае. [...] "