EJB 3.1 @LocalBean 대 주석 없음
로컬보기, 원격보기 및 인터페이스없는보기의 차이점을 이해합니다. "보기 없음"(주석 없음)과 인터페이스 없음보기의 차이점이 무엇인지 이해할 수 없습니다. 또한 내 인터페이스에 주석을 추가해야하는 이유는 @Local
무엇입니까? 인터페이스에 전혀 주석을 달지 않으면 차이가 있습니까?
규칙은 (메모리에서) 다음과 같습니다.
- Bean에
@LocalBean
어노테이션이 있음-> Bean에 인터페이스 없음보기가 있음 - Bean에
@Local
주석이 있음-> Bean에 로컬보기가 있음 - Bean에
@Remote
주석이 있음-> Bean에 원격보기가 있음 - Bean에는 뷰 어노테이션이 없지만 @Local 어노테이션이있는 인터페이스를 직접 구현-> Bean은 로컬 뷰를 가짐
- Bean은 뷰 어노테이션이 없지만 @Remote 어노테이션이있는 인터페이스를 직접 구현합니다.-> Bean은 원격 뷰를가집니다.
- Bean은 뷰 어노테이션이 없지만 뷰 어노테이션이없는 인터페이스를 직접 구현-> Bean은 로컬 뷰를 가짐
- Bean에는 뷰 어노테이션이없고 인터페이스를 구현하지 않습니다.-> Bean에는 인터페이스가없는 뷰가 있습니다.
따라서 @LocalBean
주석을 전혀 사용하지 않고 사용하는 것은 인터페이스가없는보기를 얻는 두 가지 방법입니다. 인터페이스가없는보기를 원할 경우 가장 간단한 것은 주석을 달지 않는 것입니다. 인터페이스도 구현하지 않는 경우.
@LocalBean
인터페이스보기가있는 Bean에 인터페이스없는보기를 추가하는 이유의 일부가 있습니다. 사양 작성자의 마음에서 가장 중요한 시나리오는 다음과 같은 빈이있는 시나리오였습니다.
@Stateless
public class UserPreferences {
public String getPreference(String preferenceName);
public Map<String, String> getPreferences();
}
두 메서드를 모두 로컬로 노출하고 싶지만 getPreferences()
원격으로 거친 단위 만 노출하려는 경우 . 해당 메소드로 원격 인터페이스를 선언 한 다음 @LocalBean
Bean 클래스를 두드림으로써이를 수행 할 수 있습니다 . 그것이 없으면 두 메서드를 로컬로 노출하기 위해 무의미한 로컬 인터페이스를 작성해야합니다.
또는 다른 방식으로 살펴보면 @LocalBean
인터페이스가없는보기와 같은 것이 있기 때문에 존재하고 주석 없음 옵션이 편리한 바로 가기로 존재하기 때문입니다.
- 원격 EJB : 원격 클라이언트에서 액세스 가능 (사용자 시스템에서 실행되는 Swing 또는 JavaFX 클라이언트와 같은 다른 JVM에서 실행되는 클라이언트)
- 로컬 EJB : 동일한 JVM에서 실행되는 다른 "구성 요소"(예 : 웹 프런트 엔드, 기타 EJB)에서만 액세스 할 수 있습니다.
- 인터페이스 없음보기 : 로컬과 동일하지만 비즈니스 인터페이스를 지정하지 않음
- 주석 없음 : 단순 POJO이지만 EJB는 아닙니다.
로컬 / 인터페이스 없음보기는 개체 참조를 전달할 수 있으므로 원격 EJB보다 효율적입니다.
나는 당신 / 우리가 느끼는 혼란은 역사 / 역사적 호환성 (즉, 말하자면)의 결과라고 생각합니다. 나는 어떤 차이도 구별 할 수 없다 (사양이 local-view를 사용하는 경우 인터페이스를 생성하기 위해 구현이 필요하다는 점을 제외하고)
인터페이스가없는보기는 EJB 3.0 로컬보기와 동일한 동작을 갖습니다. 예를 들어, 참조에 의한 호출 시맨틱 및 트랜잭션 및 보안 전파와 같은 기능을 지원합니다. 그러나 인터페이스가없는보기에는 별도의 인터페이스가 필요하지 않습니다. 즉, Bean 클래스의 모든 공용 메소드가 호출자에게 자동으로 노출됩니다. 기본적으로 빈 구현 절이 있고 다른 로컬 또는 원격 클라이언트보기를 정의하지 않는 세션 Bean은 인터페이스없는 클라이언트보기를 노출합니다.
좀 더 기술적 인 세부 사항에 관심이 있다면 실제로 무슨 일이 일어나고 있는지 말씀 드리겠습니다 .... 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
'Development Tip' 카테고리의 다른 글
데이터베이스 대 플랫 파일 (0) | 2020.10.23 |
---|---|
다른 어셈블리의 클래스 이름에서 유형 확인 (0) | 2020.10.23 |
babel CLI 복사 nonjs 파일 (0) | 2020.10.23 |
npm WARN notsup 건너 뛰기 선택적 종속성 : fsevents@1.0.14에 대해 지원되지 않는 플랫폼 (0) | 2020.10.23 |
모든 리전에서 실행중인 모든 Amazon EC2 인스턴스를 보려면 어떻게해야합니까? (0) | 2020.10.23 |