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


148

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

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

답변:


178

@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 빈 삽입


4
@EJB원형 주입 (하나의 싱글 톤 콩과 다른 콩이 서로 참조가 필요한)을 위해 작동합니까? (아래 내 답변을 참조하여-전환하여 올바른 일을하고 있는지 확실하지 않습니다 @EJB)
necromancer

2
구현을 주입하지 않고 구현에 개입하는 프록시입니다. 이 때문에 "늦은 바인딩"및 기타 컨테이너 기능의 이점을 얻을 수 있습니다.
him

33

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


1
@Inject를 사용할 때 정확히 주입하는 것은 무엇입니까? JavaEE 컨테이너? POJO를 주입 할 수 있습니까?
Koray Tugay 2016 년

3
CDI와 함께 CDI 컨테이너 (JavaEE 컨테이너에 번들로 제공됨)
Bozho

16

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

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

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


@MartijnBurger 코드가 편리하지도 않고 Java EE 환경도 편리하지 않습니다. 2 개의 Java 클래스를 작성 @Inject하고 서로의 공용 필드에 작성하십시오. 그것이 작동하면 내 대답이 잘못되었습니다. 그래도 문제가 해결되지 않으면 지금까지 내 대답이 맞습니다. 다음 변경 @Inject@EJB(그리고 아마도 클래스 자체에 주석을? 내가 잊어 버려.). 그런 다음 주기적 상호 주입이 정상적으로 작동해야합니다. 그래서 내가로 전환 @Inject했습니다 @EJB. 이것이 의미가 있기를 바랍니다.
necromancer

나는 두 개의 pojo를 만들고 pojo를 서로 주입했습니다. 내 설정에서 문제없이 작동 (제이보스 8.2 = CDI 1.2)
마티 버거

1
감사합니다 @MartijnBurger, 나는 그것을 확인하고 그 동안 내 대답에주의를 기울이십시오.
necromancer

당신이 달성하고자하는 것을 정확히 확신하지 못하지만, 이것은 아마도 순환 의존성없이 원하는 것을 정확하게 수행합니다. tomee.apache.org/examples-trunk/async-postconstruct/README.html . 또한 비동기 CDI 이벤트는 요구 사항에 따라 더 깔끔한 방법 일 수 있습니다.
JanM

12

다음은 주제에 대한 좋은 토론입니다. 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 선언.


1
이것은 이론적으로 질문에 답할 수 있지만 여기에 답의 필수 부분을 포함시키고 참조 링크를 제공하는 것이 좋습니다. 이렇게하면 링크가 죽었을 때도이 답변이 가치가 있습니다.
Mifeet


4

@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 참조


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.