programing

CDI와 EJB는 어떻게 비교됩니까?인터랙티브?

bestcode 2022. 9. 22. 00:28
반응형

CDI와 EJB는 어떻게 비교됩니까?인터랙티브?

저는 두 사람이 어떻게 상호작용하고 그 경계가 어디에 있는지 이해하는 데 어려움을 겪고 있습니다.겹치나요?그들 사이에 중복이 있나요?

두 가지 모두와 관련된 주석이 있다는 것은 알지만, 두 가지 모두에 대한 전체 목록을 찾을 수 없습니다.이것이 어떻게 다른지, 또는 어느 부분에서 겹치는지를 명확하게 하는 데 도움이 될지 확실하지 않습니다.

정말 혼란스럽네요.EJB에 대해 상당히 잘 이해하고 있는 것 같습니다. CDI가 제공하는 내용과 EJB가 이미 제공하는 CDI를 대체하거나 개선하는 방법을 정확히 이해하는 데 어려움을 겪고 있는 것 같습니다.

현재 Java EE에는 여러 구성 요소 모델이 있기 때문에 다소 혼란스럽습니다.CDI, EJB3, JSF 관리 콩입니다.

CDI는 새로 들어온 아이입니다.CDI 빈 기능dependency injection,scoping ★★★event busCDI 콩은 주입 및 범위 지정에 있어 가장 유연합니다.이벤트 버스는 매우 가볍고 가장 간단한 웹 애플리케이션에도 매우 적합합니다.는 이와 CDI라는 매우 의 기능도 합니다.portable extensions이는 벤더가 Java EE에 추가 기능을 제공하기 위한 플러그인 메커니즘의 일종으로, 모든 구현(Glassfish, JBoss AS, Websphere 등)에서 사용할 수 있습니다.

EJB3 콩은 기존 EJB2 구성* 요소 모델에서 개조되었으며 Java EE에서 주석을 통해 관리된 최초의 콩이었습니다.EJB3 콩 기능dependency injection,declarative transactions,declarative security,pooling,concurrency control,asynchronous execution ★★★★★★★★★★★★★★★★★」remoting

EJB3 콩의 의존성 주입은 CDI 콩만큼 유연하지 않으며 EJB3 콩은 스코핑 개념이 없습니다.그러나 EJB3 콩은 트랜잭션 방식으로** 기본적으로 풀링됩니다. CDI는 EJB3 도메인에 남겨두기로 선택했습니다.CDI에서는, 그 외의 항목도 입수할 수 없습니다.EJB3에는 자체 이벤트버스는 없지만 메시지 재생을 위한 특별한 유형의 빈(메시지 기반 빈)이 있습니다.이는 Java Messaging System 또는 JCA 리소스 어댑터를 가진 다른 시스템에서 메시지를 수신할 때 사용할 수 있습니다.간단한 이벤트에 풀 블로잉 메시지를 사용하는 것은 CDI 이벤트 버스보다 훨씬 더 무겁고 EJB3는 프로듀서 API가 아닌 청취자만 정의합니다.

JSF Managed Bean은 JSF가 포함된 이후 Java EE에 존재해 왔습니다.그것들도 특징입니다.dependency injection그리고.scopingJSF Managed Beans는 선언적 범위 지정 개념을 도입했습니다.원래 범위가 다소 제한적이어서 EJB3 콩을 주석을 통해 이미 선언할 수 있는 동일한 버전의 Java EE에서는 여전히 JSF Managed Bean을 XML로 선언해야 했습니다. 현재 버전의 JSF Managed Bean도 주석을 통해 최종적으로 선언되며 범위와 고객 생성 기능을 통해 범위가 확장됩니다.범위를 지정합니다. 스코프는 JSF Managed Bean의 고유 기능입니다.이러한 스코프는 같은 페이지에 대한 요청 간의 데이터를 기억합니다.

보기 범위를 제외하고 Java EE 6에서는 JSF Managed Beans에 대한 작업이 거의 없습니다.CDI의 뷰 범위가 누락되어 유감입니다.그렇지 않았다면 CDI는 JSF Managed Bean이 제공하는 완벽한 슈퍼셋이 되었을 것입니다.업데이트:Java EE 7/JSF 2.2에서는 CDI 호환 @ViewScoped가 추가되어 CDI는 확실히 완벽한 슈퍼셋이 되었습니다.업데이트 2: JSF2.3에서는 CDI 관리 콩을 위해 JSF 관리 콩이 폐지되었습니다.

EJB3 및 CDI의 경우 상황은 명확하지 않습니다.EJB3 구성요소 모델과 API는 CDI가 제공하지 않는 많은 서비스를 제공하므로 일반적으로 EJB3를 CDI로 대체할 수 없습니다.반면에 CDI는 EJB3와 함께 사용할 수 있습니다(예: EJB에 스코프 지원 추가).

CanDI라고 불리는 CDI 구현의 전문가 그룹 멤버이자 구현자인 Reza Rahman은 EJB3 구성 요소 모델과 관련된 서비스를 CDI 주석 세트로 개조할 수 있음을 자주 시사했습니다.이 경우 Java EE의 모든 관리 대상 콩이 CDI 콩이 될 수 있습니다.이는 EJB3가 사라지거나 쓸모없어진다는 것을 의미하는 것이 아니라, EJB의 @Stateless 및 @EJB와 같은 자체 주석을 사용하는 대신 CDI를 통해 기능이 노출된다는 것을 의미합니다.

갱신하다

TomEE와 OpenEJB의 유명 인사인 David Blevins는 CDI와 EJB의 차이점과 유사성에 대해 자신의 블로그에서 잘 설명합니다: CDI, EJB를 분리하는 시기

* EJB3 bean은 버전 번호의 증분에 불과하지만, EJB3 bean은 대부분 완전히 다른 종류였습니다. 단순한 단일 주석을 적용하면 "관리형 bean"이 되는 단순한 pojo입니다. EJB2의 모델에서는 각 bean뿐만 아니라 모든 bean에 대해 무겁고 지나치게 상세한 XML 구축 설명자가 필요했습니다.bean은 다양한 매우 무거운 컴포넌트 인터페이스를 구현하기 위해 필요하며 대부분 의미가 없는 컴포넌트 인터페이스에 필요합니다.

** 스테이트리스 세션빈이란 일반적으로 풀링되어 스테이트풀한 세션빈을 말합니다(단, 스테이트풀한 세션빈도 가능합니다.따라서 두 유형 모두 풀링은 선택 사항이며 EJB 사양은 어느 쪽이든 풀링을 의무화하지 않습니다.

CDI: 의존성 주입에 관한 것입니다.즉, 임의의 장소에 인터페이스 실장을 삽입할 수 있습니다.이 개체는 무엇이든 될 수 있으며 EJB와 관련이 없을 수 있습니다.다음은 CDI를 사용하여 랜덤 제너레이터를 주입하는 방법의 예입니다.EJB에 관한 건 아무것도 없어요.EJB가 아닌 서비스, 다른 구현 또는 알고리즘을 주입하려는 경우 CDI를 사용합니다(따라서 EJB는 전혀 필요하지 않습니다).
EJB: 이해하시겠지만 아마 혼란스러우실 겁니다.@EJB주석 - 서비스 또는 기타 서비스에 구현을 주입할 수 있습니다.주입하는 클래스는 EJB 컨테이너에서 관리해야 한다는 것이 핵심입니다. 있는 것 EE 6 준거 CDI EJB를 쓸 수 .따라서 Java EE 6 호환 서버에서는 서블릿에 둘 다 쓸 수 있습니다.

@EJB EJBService ejbService;

그리고.

@Inject EJBService ejbService;

그래서 헷갈릴 수도 있지만 EJB와 CDI의 가교 역할을 하는 건 아마 그것뿐일 거예요.

CDI에 대해서는 CDI 관리 클래스에 다른 개체를 삽입할 수 있습니다(CDI 인식 프레임워크에 의해 작성되어야 합니다).

CDI에서 제공하는 다른 기능...예를 들어, MVC 프레임워크로 Struts 2를 사용하는 경우(예만 해당), EJB 3.1을 사용하는 경우에도 이 경우 제한적임 - 사용할 수 없습니다.@EJBStruts 액션의 주석은 컨테이너에 의해 관리되지 않습니다.그러나 Struts2-CDI 플러그인을 추가하면 여기에 쓸 수 있습니다.@Inject동일한 항목에 대한 주석(따라서 더 이상 JNDI 검색이 필요하지 않음)이렇게 하면 EJB의 파워가 향상되지만 앞서 언급한 바와 같이 CDI로 무엇을 주입하는지는 중요하지 않습니다. EJB와 관련이 있는지 여부는 중요하지 않습니다. 바로 EJB의 파워입니다.

PS. 예에 대한 링크 업데이트

알버트 아인슈타인:If you can't explain it simply, you don't understand it well enough

ejbs와 CDI는 이해하기 꽤 쉽다.

Ejbs:

  1. @Stateless, @Stateful, @Request 등의 범위 한정자에 의해 항상 주석이 붙습니다.
  2. Ejbs 인스턴스는 Java EE 프레임워크에 의해 제어되고 풀링됩니다.소비자에게 인스턴스를 제공하는 것은 EE 프레임워크의 의무입니다.

@Stateless

 public class CarMaker(){
    public void createCar(Specification specs){
        Car car = new Car(specs);
    }
}

CarMaker는 특정 Ejbs 범위에 대한 주석을 달기 때문에 Ejb라고 합니다.

CDI:

  1. 인스턴스는 EE 프레임워크에 의해 완전히 관리되지 않으므로 사용자가 직접 생성해야 합니다.
  2. 항상 의존합니다.예를 들어 "Dependent"에 대해 설명하겠습니다.

    class Specification { private String color; private String model; //- Getter and Setter }

Specificationclass는 CDI입니다.이는 EJB 스코프로 주석을 달지 않고 EE 프레임워크가 아닌 당신의 코드로 초기화해야 하기 때문입니다.여기서 주목해야 할 한 가지 포인트는 우리가 주석을 달지 않았기 때문에Specificationclass, 디폴트로는 주석이 붙어 있습니다.@Dependent주석입니다.

@Dependent  <- By default added 
class Specification { ... }

Further reading:Ejbs 스코프 주석과 CDI 스코프 주석 사이에서 더 자세히 연구해야 합니다. 이 경우 개념이 더욱 명확해집니다.

언급URL : https://stackoverflow.com/questions/4684112/how-do-cdi-and-ejb-compare-interact

반응형