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

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

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

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

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

Пример:

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

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

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

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

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

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

Из Блог Адама Биенса:

Вы можете использовать обе аннотации для ввода 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 "";
}

Ответ 3

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

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