В чем разница между @Inject и @EJB - PullRequest
37 голосов
/ 05 мая 2011

В настоящее время я изучаю новые модели компонентов Java EE 6 и меня смущает новейший механизм внедрения зависимостей. Итак, вот мои вопросы:

1) В чем разница между @Inject и @ EJB

2) Если у меня есть простой POJO, который содержит другие POJO (один из них - код DAO), что будет лучшим выбором: @Inject или @EJB?

Можно ли смешивать @Inject и @EJB?

Примером может быть:

  • ClassA реализует интерфейс A и имеет экземпляр ClassA_Adaptor

  • ClassA_Adaptor реализует InterfaceAB и имеет экземпляр класса B

  • ClassB реализует интерфейс B и имеет экземпляр ClassB_Adaptor и экземпляр DAO_ClassB

  • ClassB_Adaptor реализует интерфейс B и имеет экземпляр ClassC

  • ClassC реализует InterfaceBC и имеет экземпляр WebService_ClassC

  • DAO_ClassB будет использовать JPA 2.0 (@PersistenceContext)

Я бы хотел внедрить их всех, включая DAO и WebService.

3) Это плохой подход - использовать транзакционные только для определенных операций, но не для всех?

В качестве примера: некоторые методы в DAO_ClassB являются вашим типичным запросом, в то время как другие методы являются методами «записи». Разве не оборачивать методы READ транзакцией?

Насколько я понимаю, DAO_ClassB можно обернуть транзакцией, используя @EJB (внедрите DAO_ClassB и сделайте все методы транзакционными). Как я могу это контролировать?

Извините, если некоторые вопросы сбивают с толку, потому что я знаю только кусочки новой модели компонента Java EE 6.

Ответы [ 3 ]

30 голосов
/ 09 мая 2011
  1. @ EJB внедряет только EJB, но @Inject может использоваться для ввода POJO, а не EJB.Однако @Inject требует, чтобы ваш архив был BDA (содержать beans.xml для EE 6 или неявно в EE 7).@Inject также имеет дополнительные специфичные для CDI возможности (области, перехватчики и т. Д.), Но эти возможности требуют дополнительных затрат.Серверы приложений поддерживают указание привязок @EJB, чтобы развертыватель мог выбрать целевой EJB, но @Inject позволяет разработчику приложения только выбирать целевой EJB (и он должен существовать в приложении).

  2. Если целью не является EJB, вы не должны использовать @ EJB.

  3. Это зависит от того, выполняете ли вы несколько взаимосвязанных запросов, а затем пытаетесь вести бизнесрешения.Вы должны понимать уровни изоляции и учитывать их даже для операций только для чтения.

10 голосов
/ 06 мая 2014

От Веб-журнал Адама Бинса:

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

@Inject does not have any methods / attributes--it is just a plain annotation:


@Target(value = {ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface Inject {
}

С другой стороны, аннотация @EJB позволяет передавать дополнительную информацию, которая может быть полезна для ссылки на удаленные EJB, или EJB, которые нельзя просто внедрить в стиле «Соглашение по конфигурации»:

@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface EJB {

    public String name() default "";

    public String beanName() default "";

    public Class beanInterface() default Object.class;

    public String mappedName() default "";
}
5 голосов
/ 09 мая 2011
  1. @ Inject является более общим, чем EJB, и является частью спецификации CDI.Поэтому, если вы хотите использовать @Inject, вам нужна его реализация на вашем сервере.

  2. Для POJO (не EJB) вы должны использовать @Inject.

...