Должен ли я использовать @EJB или @Inject
Я нашел этот вопрос: В чем разница между @Inject и @EJB, но я не стал мудрее. Я еще не делал Java EE и не имел опыта с инъекцией зависимостей, поэтому я не понимаю, что я должен использовать?
Является ли @EJB и старый способ инъекции? Является ли инъекция, выполняемая контейнером EJB при использовании этой аннотации при использовании @Inject, использовать новую структуру CDI? Разве это разница, и должен ли я использовать @Inject вместо @EJB, если это так?
Ответы
Ответ 1
@EJB
используется для вставки только EJB и доступен уже довольно давно. @Inject
может вводить любые управляемые bean и является частью новой спецификации CDI (начиная с Java EE 6).
В простых случаях вы можете просто изменить @EJB
на @Inject
. В более сложных случаях (например, когда вы сильно зависите от атрибутов @EJB
, таких как beanName
, lookup
или beanInterface
), чем для использования @Inject
вам нужно определить поле или метод @Producer
.
Эти ресурсы могут быть полезны для понимания различий между @EJB
и @Produces
и как получить лучшее из них:
Блог Антонио Гонсалвес:
CDI Part I
CDI Part II
CDI Part III
Документация JBoss Weld:
CDI и экосистема Java EE
StackOverflow:
Inject @EJB bean на основе условий
Ответ 2
@Inject
может вводить любой bean, а @EJB
может вводить только EJB. Вы можете использовать либо для ввода EJB, но я бы предпочел @Inject
всюду.
Ответ 3
Вот хорошая дискуссия по этой теме. Gavin King рекомендует @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 | Ссылка Gavin King
Эта ошибка очень странная, так как локальные ссылки EJB всегда должны быть быть сериализуемым. Ошибка в стеклянной рыбке, возможно?
В принципе, @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 | Ссылка Гэвин Кинг
Значит ли это @EJB лучше с удаленными EJB?
Для удаленного EJB мы не можем объявлять метаданные, такие как квалификаторы, @Alternative и т.д., В классе bean, так как клиент просто не получая доступ к этим метаданным. Кроме того, некоторые дополнительные необходимо указать метаданные, которые нам не нужны для локального случая (глобальное JNDI-имя). Итак, все, что нужно сделать где-то еще: именно объявление @Produces.
Ответ 4
Обновление: Этот ответ может быть неправильным или устаревшим. Подробнее см. Комментарии.
Я переключился с @Inject
на @EJB
, потому что @EJB
допускает круговую инъекцию, тогда как @Inject
pukes на нем.
Подробности: Мне нужно @PostConstruct
вызвать метод @Asynchronous
, но он будет делать это синхронно. Единственный способ сделать асинхронный вызов состоял в том, чтобы иметь первоначальный вызов методом другого bean и вернуть ему метод исходного bean. Для этого каждый bean нуждался в ссылке на другой - таким образом, круговой. @Inject
не удалось выполнить эту задачу, тогда как @EJB
работал.
Ответ 5
Также может быть полезно понять разницу в терминах Session Bean Identity при использовании @EJB и @Inject.
Согласно спецификациям, следующий код всегда будет true
:
@EJB Cart cart1;
@EJB Cart cart2;
… if (cart1.equals(cart2)) { // this test must return true ...}
Использование @Inject вместо @EJB не то же самое.
см. также идентификатор состояния beans для получения дополнительной информации
Ответ 6
Инъекция уже существовала в Java EE 5 с комментариями @Resource, @PersistentUnit или @EJB, например.
Но он был ограничен определенными ресурсами (datasource, EJB...) и определенными компонентами (сервлеты, EJB, поддержка JSF
bean.,.). С CDI вы можете вставлять почти все, что угодно, благодаря аннотации @Inject.