이 질문을 찾았습니다 : @Inject와 @EJB의 차이점은 무엇입니까? 있지만 더 현명하지는 않았다. Java EE를 수행하지 않았거나 종속성 주입에 대한 경험이 없어서 사용해야 할 것을 이해하지 못합니까?
@EJB는 오래된 주입 방법입니까? @Inject를 사용하는 동안이 주석을 사용할 때 EJB 컨테이너가 주입을 수행합니까? 새로운 CDI 프레임 워크를 사용합니까? 차이점이 있습니까? 그렇다면 @EJB 대신 @Inject를 사용해야합니까?
답변
은 @EJB
EJB의 단지를 주입하는 데 사용 지금은 꽤 오랫동안 사용할 수 있습니다. @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
@EJB
EJB를 주입 할 수있는 동안 모든 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로 주입?
- 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로 주입?
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 주석 덕분에 거의 모든 것을 주입 할 수 있습니다.