В чем разница между @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.