Должен ли я использовать @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?

  1. Ноябрь 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?

  1. Ноябрь 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.