Jaka jest różnica między @ Inject i @EJB
Obecnie uczę się nowych modeli komponentów Java EE 6 i jestem mylony z najnowszym mechanizmem wtrysku zależności. Oto moje pytania:
1) Jaka jest różnica między @ Inject a @ EJB
2) Jeśli mam proste POJO, które zawiera inne Pojo( które z nich jest kodem DAO), jaki byłby lepszy wybór: @ Inject czy @ EJB?
Czy Mogę wymieszać @ Inject i @ EJB?
Przykładem może być:
-
ClassA implementuje interfejs i ma instancja ClassA_Adaptor
-
ClassA_Adaptor implementuje InterfaceAB i ma instancję ClassB
-
ClassB implementuje interfejs i ma instancja ClassB_Adaptor oraz instancja DAO_ClassB
-
ClassB_Adaptor implementuje interfejs i ma instancję ClassC
-
ClassC implementuje interfejs i ma przykład WebService_ClassC
-
DAO_ClassB użyje JPA 2.0 (@PersistenceContext)
Chciałbym wstrzyknąć je wszystkie łącznie z DAO i WebService.
3) czy to złe podejście, aby używać transakcji tylko dla niektórych operacji, ale nie dla wszystkich?
Jako przykład: niektóre metody w DAO_ClassB są typowymi zapytaniami, podczas gdy inne metody są metodami "write". Czy źle jest nie owijać metod" odczytu " transakcją?
Z mojego zrozumienia, DAO_ClassB może być owinięty transakcją za pomocą @ EJB (inject the DAO_ClassB i uczynić wszystkie metody Transakcyjnymi). Jak mogę to kontrolować?
Przepraszam, jeśli niektóre pytania są mylące, ponieważ znam tylko fragmenty nowego modelu komponentu Java EE 6.
3 answers
@EJB wstrzykuje tylko EJB, ale @Inject może być używany do wstrzykiwania POJOs zamiast EJB. Jednak @Inject wymaga, aby Twoje archiwum było BDA (contain beans.xml dla EE 6, lub w domyśle w EE 7). @Inject posiada również dodatkowe możliwości specyficzne dla CDI (lunety, przechwytywacze itp.), ale te możliwości ponoszą dodatkowe koszty. Serwery aplikacji obsługują określanie wiązań @ EJB, dzięki czemu Wdrożeniowiec może wybrać docelowy EJB, ale @Inject pozwala TYLKO twórcom aplikacji wybierz docelowy EJB (i musi istnieć w aplikacji).
Jeśli celem nie jest EJB, nie wolno używać @EJB.
To zależy od tego, czy tworzysz wiele powiązanych ze sobą zapytań, a następnie próbujesz podejmować decyzje biznesowe. Musisz zrozumieć poziomy izolacji i wziąć je pod uwagę, nawet w przypadku operacji tylko do odczytu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 16:03:47
From Adam Biens Weblog:
Możesz użyć obu adnotacji do wstrzyknięcia EJB. Zacznij od @Inject, a jeśli napotkasz jakiekolwiek problemy, przełącz się na @ 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 {
}
Z drugiej strony, adnotacja @EJB pozwala przekazać dodatkowe informacje, które mogą być przydatne do odwoływania się do zdalnych EJB, lub EJB, których nie można łatwo wstrzyknąć w stylu "Convention over Configuration":
@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 "";
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-10 11:08:23
@Inject jest bardziej ogólny niż EJB i jest częścią specyfikacji CDI. Więc jeśli chcesz użyć @Inject, potrzebujesz implementacji tego na swoim serwerze.
W przypadku POJOs (nie EJB) musisz użyć @ Inject.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-09 05:22:42