Объявление @Resource и @EJB на уровне класса в Java EE6 - PullRequest
3 голосов
/ 30 мая 2011

Есть ли еще ситуации (учитывая, что Java EE6 имеет стандарты java: global /, app /, module / naming), требующие объявления EJB или ресурсов, как в примере ниже?

@EJB (name = "ejb/PlaceBid", beanInterface = PlaceBid.class)
public class ActionBazaarBidControllerServlet extends HttpServlet {

}

Поиск PlaceBidв классе помощника, используемом ActionBazaarBidControllerServlet

PlaceBid placeBid = (PlaceBid)context.lookup("java:comp/env/ejb/PlaceBid");

Ответы [ 2 ]

18 голосов
/ 31 мая 2011

Пространство имен java:comp/env/ иногда является мало понятной особенностью.Это пространство имен соответствует тому, что называется Enterprise Naming Context (ENC).

Это похоже на частную "хэш-карту", связанную с каждым компонентом, причем весь веб-модуль обрабатывается как один компонент, а отдельные компоненты EJB-компонентов являются компонентами.а также.

Вы используете это частное пространство имен в основном для псевдонимов .Если вы отображаете что-то в «ejb / PlaceBid», то весь (вспомогательный) код может использовать «ejb / PlaceBid», и в одном глобальном местоположении (в данном случае сервлет, но также может быть XML) вы можете определить, что именно отображаетсяк этому.Если весь код перешел непосредственно к java:global/..., тогда это имя может содержать десятки жестко закодированных зависимостей.

Итак, вы должны использовать это, если вам нужно дополнительное перенаправление.


Некоторыедругие вещи, чтобы отметить:

1.С помощью EJB SessionContext вы можете напрямую ссылаться на это пространство имен, например:

PlaceBid placeBid = (PlaceBid)sessionContext.lookup("ejb/PlaceBid");

Здесь "ejb / PlaceBid" - это относительное имя в ENC.

2.Как уже упоминалось, ENC является закрытым для каждого компонента.Разные EJB могут иметь заданное относительное имя, отображаемое по-разному.Таким образом, context.lookup("java:comp/env/ejb/PlaceBid") может возвращать что-то другое в зависимости от того, из какого компонента вы выполняете вызов.

3.Исторически ENC предшествовал тому, что мы сейчас называем инъекцией .В некотором смысле, когда вы указали отображение в XML, вы «внедрили» что-то в частную «хэш-карту», ​​связанную с этим компонентом.Современная версия внедряется в поля, конструкторы или свойства (сеттеры), но старая версия внедряется в «ключи».

Даже в EJB3.1 исторический механизм «инъекции» все еще активен под капотом.Если вы выполняете, казалось бы, нормальную инъекцию, используя @EJB для поля, это также автоматически создает запись в ENC JNDI.Например,

package test;

@Stateless
public class MyBean {

   @EJB
   private MyService myService;

}

В этом случае все, что вводится в myService, также сохраняется в ENC под именем java:comp/env/test.MyBean/myService.Чтобы завершить ссылку аннотацией @EJB, которую вы использовали в сервлете: вы можете дополнительно использовать атрибут name, чтобы указать имя, под которым хранится ссылка в ENC:

@Stateless
public class MyBean {

   @EJB(name = "ejb/PlaceBid")
   private MyService myService;

}

Небольшой счетчик-интуитивно, но в большинстве случаев атрибут name здесь, таким образом, не является чем-то, что указывает на источник , откуда берется объект для инъекции, но он используется как target в ENC для инъекций.

0 голосов
/ 31 мая 2011

Объявление ссылки с использованием аннотации на уровне класса и объявление ссылки с использованием java: module, java: app или java: global name - это отдельные функции.

Вы могли бы использовать аннотацию на уровне класса для объявления ссылки, если вам не требуется внедрение, но вы не хотите использовать XML.

Вы должны использовать имя java: module, java: app или java: global (независимо от того, как определяется ссылка), если вы хотите, чтобы несколько компонентов в модуле, приложении или сервере имели доступ к одной и той же ссылке. Например, так что вам нужно только один раз определить привязку для ссылки, а не повторять одну и ту же информацию привязки для каждой идентичной привязки в модуле (или в приложении, или для всех приложений на сервере).

...