Подтвердить что ты не робот

Что делает аннотация @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, ищут. Я просто хочу знать, что происходит с результатом этого поиска.

4b9b3361

Ответ 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" ) само по себе не работает: он копирует ссылку на себя. Это может быть связано с тем, что сервер приложений теперь знает во время компиляции, что эта ссылка требуется, но об этом.

Ответ 4

Что касается вопроса о бонусе: Да, две аннотации относительно транзакций повторяют значения по умолчанию: По умолчанию TransactionManagementType - CONTAINER (vs BEAN), а значение по умолчанию - TransactionAttributeType REQUIRED просто указывает, что если bean вызывается внутри транзакционный контекст транзакция продолжается, в противном случае будет инициирована новая транзакция (в отличие от, например, REQUIRES_NEW, которая всегда будет создавать новый tx). Это на самом деле подробно не так тривиально, как кажется Cf. спецификация EJB 3.1:

"13.3.7 Спецификация атрибутов транзакции для методов Bean

Поставщик bean предприятия bean с демаркацией транзакций с контейнером может указывать атрибуты транзакции для методов предприятия Bean. По умолчанию значение транзакции атрибут для метода bean с демаркацией транзакций, управляемых контейнером, является ТРЕБУЕМЫМ атрибут транзакции и атрибут транзакции не должны быть явно указаны в этом случае. [...] "