Development Tip

EJB 3.1 @LocalBean 대 주석 없음

yourdevel 2020. 10. 23. 19:11
반응형

EJB 3.1 @LocalBean 대 주석 없음


로컬보기, 원격보기 및 인터페이스없는보기의 차이점을 이해합니다. "보기 없음"(주석 없음)과 인터페이스 없음보기의 차이점이 무엇인지 이해할 수 없습니다. 또한 내 인터페이스에 주석을 추가해야하는 이유는 @Local무엇입니까? 인터페이스에 전혀 주석을 달지 않으면 차이가 있습니까?


규칙은 (메모리에서) 다음과 같습니다.

  1. Bean에 @LocalBean어노테이션이 있음-> Bean에 인터페이스 없음보기가 있음
  2. Bean에 @Local주석이 있음-> Bean에 로컬보기가 있음
  3. Bean에 @Remote주석이 있음-> Bean에 원격보기가 있음
  4. Bean에는 뷰 어노테이션이 없지만 @Local 어노테이션이있는 인터페이스를 직접 구현-> Bean은 로컬 뷰를 가짐
  5. Bean은 뷰 어노테이션이 없지만 @Remote 어노테이션이있는 인터페이스를 직접 구현합니다.-> Bean은 원격 뷰를가집니다.
  6. Bean은 뷰 어노테이션이 없지만 뷰 어노테이션이없는 인터페이스를 직접 구현-> Bean은 로컬 뷰를 가짐
  7. Bean에는 뷰 어노테이션이없고 인터페이스를 구현하지 않습니다.-> Bean에는 인터페이스가없는 뷰가 있습니다.

따라서 @LocalBean주석을 전혀 사용하지 않고 사용하는 것은 인터페이스가없는보기를 얻는 두 가지 방법입니다. 인터페이스가없는보기를 원할 경우 가장 간단한 것은 주석을 달지 않는 것입니다. 인터페이스도 구현하지 않는 경우.

@LocalBean인터페이스보기가있는 Bean에 인터페이스없는보기를 추가하는 이유의 일부가 있습니다. 사양 작성자의 마음에서 가장 중요한 시나리오는 다음과 같은 빈이있는 시나리오였습니다.

@Stateless
public class UserPreferences {
    public String getPreference(String preferenceName);
    public Map<String, String> getPreferences();
}

두 메서드를 모두 로컬로 노출하고 싶지만 getPreferences()원격으로 거친 단위 만 노출하려는 경우 . 해당 메소드로 원격 인터페이스를 선언 한 다음 @LocalBeanBean 클래스를 두드림으로써이를 수행 할 수 있습니다 . 그것이 없으면 두 메서드를 로컬로 노출하기 위해 무의미한 로컬 인터페이스를 작성해야합니다.

또는 다른 방식으로 살펴보면 @LocalBean인터페이스가없는보기와 같은 것이 있기 때문에 존재하고 주석 없음 옵션이 편리한 바로 가기로 존재하기 때문입니다.


  • 원격 EJB : 원격 클라이언트에서 액세스 가능 (사용자 시스템에서 실행되는 Swing 또는 JavaFX 클라이언트와 같은 다른 JVM에서 실행되는 클라이언트)
  • 로컬 EJB : 동일한 JVM에서 실행되는 다른 "구성 요소"(예 : 웹 프런트 엔드, 기타 EJB)에서만 액세스 할 수 있습니다.
  • 인터페이스 없음보기 : 로컬과 동일하지만 비즈니스 인터페이스를 지정하지 않음
  • 주석 없음 : 단순 POJO이지만 EJB는 아닙니다.

로컬 / 인터페이스 없음보기는 개체 참조를 전달할 수 있으므로 원격 EJB보다 효율적입니다.


나는 당신 / 우리가 느끼는 혼란은 역사 / 역사적 호환성 (즉, 말하자면)의 결과라고 생각합니다. 나는 어떤 차이도 구별 할 수 없다 (사양이 local-view를 사용하는 경우 인터페이스를 생성하기 위해 구현이 필요하다는 점을 제외하고)

인터페이스가없는보기는 EJB 3.0 로컬보기와 동일한 동작을 갖습니다. 예를 들어, 참조에 의한 호출 시맨틱 및 트랜잭션 및 보안 전파와 같은 기능을 지원합니다. 그러나 인터페이스가없는보기에는 별도의 인터페이스가 필요하지 않습니다. 즉, Bean 클래스의 모든 공용 메소드가 호출자에게 자동으로 노출됩니다. 기본적으로 빈 구현 절이 있고 다른 로컬 또는 원격 클라이언트보기를 정의하지 않는 세션 Bean은 인터페이스없는 클라이언트보기를 노출합니다.

EJB 3.1 릴리스 이전의 Oracle 블로그


좀 더 기술적 인 세부 사항에 관심이 있다면 실제로 무슨 일이 일어나고 있는지 말씀 드리겠습니다 .... EJB 객체에 직접 액세스 할 수 없다는 것은 실제 EJB 객체의 참조 (주소)가 없음을 의미합니다. EJB를 조회하거나 삽입 할 때 컨테이너는 해당 EJB (프록시 또는 래퍼라고 부를 수 있음)에 대한 클라이언트로 개체를 제공하고 해당 프록시 개체에서 비즈니스 메서드를 호출합니다. (그래서 EJB 클래스의 객체를 생성하기 위해 new 키워드를 사용하지 말아야합니다)

이제 각 유형의 주석에 대해 컨테이너는 서로 다른 방법과 기능으로 서로 다른 유형의 프록시를 생성합니다.

@LocalBean (또는 주석 없음) 프록시 개체에는 다음이 있습니다.

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local프록시 개체는 로컬 호출 및 유형을 사용 com.sun.proxy하므로 다음과 같습니다.

  • getSerializableObjectFactory()
  • isProxyClass()
  • getProxyClass()
  • getInvocationHandler()
  • newProxyInstance()

@Remote 래퍼 개체는 원격 호출을 사용하며 다음을 포함합니다.

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()

참고 URL : https://stackoverflow.com/questions/10889563/ejb-3-1-localbean-vs-no-annotation

반응형