EJB3 - получение бина с помощью инъекций и поиска - каковы различия, последствия, ошибки? - PullRequest
9 голосов
/ 18 января 2010

Есть два способа получения экземпляра EJB:

  • внедрение зависимостей в сервлетах и ​​EJB-компонентах через аннотацию @EJB
  • Поиск JNDI через Context.lookup в любом месте

Каковы различия, последствия и недостатки в использовании любого из этих подходов? Они одинаковы? Внедрение зависимостей быстрее, чем поиск? Как насчет обработки транзакций и управления жизненным циклом объекта?

Вещи, которые я знаю, включают:

аннотация

  • работает только с сервлетами и EJB
  • удобный синтаксис
  • контейнер независимый

поиск

  • может программно создавать экземпляры различных реализаций интерфейса EJB во время выполнения.
  • работает откуда угодно - например, POJOs.
  • зависит от соглашения по именованию контейнера

Ответы [ 3 ]

6 голосов
/ 18 января 2010

Оба достигают одинакового результата. Это скорее вопрос сцепления . С помощью аннотации вы добьетесь слабой связи, и ее легче будет смоделировать и проверить. При прямом поиске вы зависите от исходного контекста, который иногда может быть неудобным.

ИМХО поиск не работает везде . Например, в Glassfish поиск локального EJB-компонента из POJO будет работать только в том случае, если ранее он был «импортирован» с @EJBs(...) в одном из сессионных компонентов, использующих POJO. См. это обсуждение . Для этого вам необходимо понять разницу между local и global JNDI.

Мой совет: используйте как можно больше аннотаций. Если POJO нужна ссылка на EJB, передайте его как параметр (например, в конструкторе). Это называется инверсией зависимости и в любом случае является хорошей практикой.

2 голосов
/ 18 января 2010

Поиск зависит от наличия реализации JNDI, то есть необходимо настроить реализацию JNDI для запуска модульных тестов, затем аннотированные поля можно настроить вручную.

0 голосов
/ 27 января 2011

Я думаю, довольно сложно издеваться над аннотированными EJB-компонентами. При использовании поиска вы можете создать некоторый коммутатор в соответствии с вашей средой (test -> LoginMockBean, production -> LoginBean).

...