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.

Author: Arjan Tijms, 2011-05-04

3 answers

  1. @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).

  2. Jeśli celem nie jest EJB, nie wolno używać @EJB.

  3. 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.

 31
Author: Brett Kail,
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 "";
}
 11
Author: Pramod Alagambhat,
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
  1. @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.

  2. W przypadku POJOs (nie EJB) musisz użyć @ Inject.

 6
Author: victor herrera,
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