Должен ли я использовать @EJB или @Inject - PullRequest
139 голосов
/ 15 ноября 2011

Я нашел этот вопрос: В чем разница между @Inject и @ EJB , но я ничего не понял. Я не делал Java EE раньше, и у меня нет опыта внедрения зависимостей, поэтому я не понимаю, что мне следует использовать?

Является ли @EJB и старый способ введения? Осуществляется ли внедрение EJB-контейнера при использовании этой аннотации при использовании @Inject с использованием новой инфраструктуры CDI? В этом ли разница, и я должен использовать @Inject вместо @EJB, если это так?

Ответы [ 6 ]

170 голосов
/ 15 ноября 2011

@EJB используется только для инъекции EJB и доступен в течение достаточно долгого времени. @Inject может внедрять любой управляемый компонент и является частью новой спецификации CDI (начиная с Java EE 6).

В простых случаях вы можете просто изменить @EJB на @Inject. В более сложных случаях (например, когда вы сильно зависите от атрибутов @EJB, таких как beanName, lookup или beanInterface), чем для использования @Inject, вам потребуется определить поле или метод @Producer .

Эти ресурсы могут быть полезны для понимания различий между @EJB и @Produces и того, как получить лучшее из них:

Блог Антонио Гонсалвеса:
CDI, часть I
CDI, часть II
CDI Часть III

Документация JBoss Weld:
CDI и экосистема Java EE

StackOverflow:
Внедрить бин @EJB в зависимости от условий

31 голосов
/ 15 ноября 2011

@Inject может вводить любой компонент, а @EJB может вводить только EJB.Вы можете использовать любой из них для внедрения EJB, но я бы предпочел @Inject везде.

14 голосов
/ 12 мая 2013

Обновление: Этот ответ может быть неправильным или устаревшим. Пожалуйста, смотрите комментарии для деталей.

Я переключился с @Inject на @EJB, потому что @EJB допускает круговую инъекцию, тогда как @Inject рвёт его.

Подробности: мне нужно было @PostConstruct, чтобы вызвать метод @Asynchronous, но это происходило бы синхронно. Единственный способ сделать асинхронный вызов состоял в том, чтобы исходный вызов вызвал метод другого компонента и заставил его вызвать метод исходного компонента. Для этого каждому бину требовалась ссылка на другой - таким образом, круговой. @Inject не удалось выполнить эту задачу, тогда как @EJB сработало.

12 голосов
/ 05 октября 2012

Вот хорошая дискуссия по теме.Гевин Кинг рекомендует @Inject over @EJB для не удаленных EJB.

http://www.seamframework.org/107780.lace

или

https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace

Re: инъекция с помощью @EJB или @Inject?

ноябрь 2009, 20:48 Америка / New_York |Link Gavin King

Эта ошибка очень странная, поскольку локальные ссылки EJB всегда должны быть сериализуемыми.Ошибка в Glassfish, возможно?

По сути, @Inject всегда лучше, поскольку:

it is more typesafe,
it supports @Alternatives, and
it is aware of the scope of the injected object.

Я рекомендую не использовать @EJB, за исключением объявления ссылок на удаленные EJB.

и

Re: Инъекция с помощью @EJB или @Inject?

ноя 2009, 17:42 Америка / New_York |Link Gavin King

Значит ли это @EJB лучше для удаленных EJB?

Для удаленного EJB мы не можем объявлять метаданные, такие как квалификаторы, @Alternative и т. Д., В классе компонента, поскольку у клиента просто не будет доступа к этим метаданным,Кроме того, должны быть указаны некоторые дополнительные метаданные, которые нам не нужны для локального случая (глобальное имя JNDI любого типа).Так что все эти вещи нужно отправлять куда-то еще, а именно: декларация @Produces.

4 голосов
/ 08 августа 2017

Также может быть полезно понять разницу в терминах идентификатора сессионного компонента при использовании @EJB и @Inject. В соответствии со спецификациями следующий код всегда будет true:

@EJB Cart cart1;
@EJB Cart cart2;
… if (cart1.equals(cart2)) { // this test must return true ...}

Использование @Inject вместо @EJB не совпадает.

см. Также идентификатор сеансовых компонентов без сохранения состояния для получения дополнительной информации

0 голосов
/ 12 июня 2016

Инъекция уже существовала в Java EE 5, например, с аннотациями @Resource, @PersistentUnit или @EJB.Но он был ограничен определенными ресурсами (источником данных, EJB ...) и определенными компонентами (сервлетами, EJB, компонентом поддержки JSF ...).Благодаря CDI вы можете вводить практически все, где угодно, благодаря аннотации @Inject.

...