[java] @EJB 또는 @Inject를 사용해야합니까

이 질문을 찾았습니다 : @Inject와 @EJB의 차이점은 무엇입니까? 있지만 더 현명하지는 않았다. Java EE를 수행하지 않았거나 종속성 주입에 대한 경험이 없어서 사용해야 할 것을 이해하지 못합니까?

@EJB는 오래된 주입 방법입니까? @Inject를 사용하는 동안이 주석을 사용할 때 EJB 컨테이너가 주입을 수행합니까? 새로운 CDI 프레임 워크를 사용합니까? 차이점이 있습니까? 그렇다면 @EJB 대신 @Inject를 사용해야합니까?



답변

@EJBEJB의 단지를 주입하는 데 사용 지금은 꽤 오랫동안 사용할 수 있습니다. @Inject관리되는 Bean을 삽입 할 수 있으며 Java EE 6부터 새 CDI 스펙의 일부입니다.

간단한 경우로 간단히 변경할 @EJB@Inject있습니다. 고급의 경우 (당신이 무겁게에 의존 할 때 예에서 @EJB의 속성처럼 beanName, lookup또는 beanInterface사용하기 위해서는보다) @Inject정의해야합니다 당신을 @Producer필드 나 메소드를.

이러한 자료는 다음 @EJB과 의 차이점을 이해하는 데 도움이 될 수 있습니다 @Produces.

Antonio Goncalves의 블로그 :
CDI 파트 I
CDI 파트 II
CDI 파트 III

JBoss Weld 문서 :
CDI 및 Java EE 에코 시스템

StackOverflow :
조건에 따라 @EJB 빈 삽입


답변

@Inject@EJBEJB를 주입 할 수있는 동안 모든 Bean을 주입 할 수 있습니다. EJB를 주입하는 데 사용할 수 있지만 어느 @Inject곳에서나 선호합니다 .


답변

업데이트 : 이 답변이 정확하지 않거나 구식 일 수 있습니다. 자세한 내용은 의견을 참조하십시오.

I은 전환 @Inject@EJB있기 @EJB반면, 원형 주입 있도록 @Inject그것에 pukes한다.

세부 정보 : 메소드 @PostConstruct를 호출 @Asynchronous해야했지만 동기식으로 수행됩니다. 비동기 호출을 수행하는 유일한 방법은 원래 호출에 다른 Bean의 메소드를 설정하고 원래 Bean의 메소드를 다시 호출하는 것입니다. 이를 위해 각 Bean은 다른 Bean에 대한 참조가 필요했습니다. @Inject이 작업에는 실패했지만 @EJB작동했습니다.


답변

다음은 주제에 대한 좋은 토론입니다. Gavin King은 비 원격 EJB의 경우 @EJB보다 @Inject를 권장합니다.

http://www.seamframework.org/107780.lace

또는

https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace

다시 : @EJB 또는 @Inject로 주입?

  1. 2009 년 11 월 20:48 아메리카 / 뉴욕 | 링크 개빈 킹

EJB 로컬 참조는 항상 직렬화 가능해야하므로이 오류는 매우 이상합니다. 글래스 피쉬 버그일까요?

기본적으로 @Inject는 다음과 같은 이유로 항상 좋습니다.

it is more typesafe,
it supports @Alternatives, and
it is aware of the scope of the injected object.

원격 EJB에 대한 참조를 선언하는 경우를 제외하고 @EJB를 사용하지 않는 것이 좋습니다.

다시 : @EJB 또는 @Inject로 주입?

  1. 2009 년 11 월 17 일 17:42 아메리카 / 뉴욕 | 링크 개빈 킹

    원격 EJB를 사용하면 @EJB가 더 우수합니까?

원격 EJB의 경우 클라이언트가 단순히 해당 메타 데이터에 액세스 할 수 없으므로 Bean 클래스에서 규정 자, @Alternative 등의 메타 데이터를 선언 할 수 없습니다. 또한 로컬 사례 (글로벌 JNDI 이름)에 필요하지 않은 일부 추가 메타 데이터를 지정해야합니다. 따라서 모든 것들이 다른 곳으로 가야합니다 : 즉 @Produces 선언.


답변

@EJB 및 @Inject를 사용할 때 Session Bean Identity의 용어 차이를 이해하는 것이 유용 할 수 있습니다. 사양에 따르면 다음 코드는 항상 다음과 같습니다 true.

@EJB Cart cart1;
@EJB Cart cart2;
 if (cart1.equals(cart2)) { // this test must return true ...}

@EJB 대신 @Inject를 사용하면 동일하지 않습니다.

추가 정보 는 Stateless Session Bean ID 참조


답변

예를 들어 @Resource, @PersistentUnit 또는 @EJB 어노테이션이있는 Java EE 5에 주입이 이미 존재합니다. 그러나 특정 리소스 (데이터 소스, EJB …) 및 특정 구성 요소 (서블릿, EJB, JSF 지원 Bean 등)로 제한되었습니다. CDI를 사용하면 @Inject 주석 덕분에 거의 모든 것을 주입 할 수 있습니다.


답변