SeamFramework.orgCommunity Documentation
이미 Web Beans 의존성 삽입 모델은 배치시 API 구현을 덮어쓰기 하게 합니다. 예를 들어, 다음과 같은 엔터프라이즈 Web Bean은 제품에서 API PaymentProcessor
구현을 제공합니다:
@CreditCard @Stateless
public class CreditCardPaymentProcessor
implements PaymentProcessor {
...
}
staging 환경에서, 다른 Web Bean을 사용하여 PaymentProcessor
구현을 덮어쓰기 합니다:
@CreditCard @Stateless @Staging
public class StagingCreditCardPaymentProcessor
implements PaymentProcessor {
...
}
StagingCreditCardPaymentProcessor
를 사용하여 실행하려는 작업은 특정 시스템 배치에 AsyncPaymentProcessor
를 완전 교체하는 것입니다. 여기서 배치 유형 @Staging
은 기본값 배치 유형 @Production
보다 높은 우선 순위를 갖게 되므로 클라이언트는 다음과 같은 삽입 지점을 사용하게 됩니다:
@CreditCard PaymentProcessor ccpp
StagingCreditCardPaymentProcessor
인스턴스를 받고자 합니다.
불행하게도 여기에는 몇 가지 함정이 있습니다:
높은 우선 순위의 Web Bean은 덮어쓰기하려는 Web Bean의 모든 API 유형을 구현할 수 없습니다.
높은 우선 순위의 Web Bean은 덮어쓰기하려는 Web Bean의 모든 바인딩 유형을 명시할 수 없습니다.
높은 우선 순위의 Web Bean은 덮어 쓰기하려는 Web Bean과 동일한 이름을 갖을 수 없습니다.
덮어쓰기하려는 Web Bean은 생산자 방식, 폐지 방식 또는 옵저버 방식을 명시할 수 있습니다.
이러한 경우, 덮어 쓰기하려는 Web Bean은 런타임시 호출 가능해야 합니다 따라서, 덮어쓰기는 다소 개발자 오류를 초래하는 경우가 있습니다.
Web Beans는 특성화라는 특별 기능을 제공하여, 개발자들이 이러한 함정에 빠지지 않도록 돕습니다. 특성화 기능은 처음에는 조금 난해하게 보이지만, 익숙해 지면 사용하기 쉬우며 제공되는 추가 보안 기능에 만족하실 것입니다.
특성화는 심플 Web Beans 및 엔터프라이즈 Web Beans에만 있는 기능입니다. 특성화 기능을 사용하려면 높은 우선 순위의 Web Bean은 다음 사항을 따라야 합니다:
덮어쓰기할 Web Bean의 직접적인 하부 클래스가 되어야 합니다.
덮어쓰기할 Web Bean이 심플 Web Bean일 경우 심플 Web Bean이 되어야 하고 또는 덮어쓰기 할 Web Bean이 엔터프라이즈 Web Bean일 경우 엔터프라이즈 Web Bean이 되어야 합니다
@Specializes
로 어노테이션되어야 합니다.
@Stateless @Staging @Specializes
public class StagingCreditCardPaymentProcessor
extends CreditCardPaymentProcessor {
...
}
높은 우선 순위의 Web Bean이 해당 상위클래스를 특성화한다고 합니다.
특성화 기능 사용시:
상위클래스의 바인딩 유형은 @Specializes
로 어노테이션된 Web Bean에 의해 자동으로 상속됩니다
상위클래스의 Web Bean 이름은 @Specializes
로 어노테이션된 Web Bean에 의해 자동으로 상속됩니다
상위클래스에 의해 명시된 생산자 방식, 폐지 방식 및 옵저버 방식은 @Specializes
로 어노테이션된 Web Bean 인스턴스를 호출합니다.
예에서 CreditCardPaymentProcessor
의 @CreditCard
바인딩 유형은 StagingCreditCardPaymentProcessor
에 의해 전승됩니다.
Web Bean 관리자는 다음 사항을 유효화합니다:
상위클래스의 모든 API 유형은 @Specializes
로 어노테이션된 Web Bean의 API 유형입니다 (상위클래스 엔터프라이즈 빈의 모든 로컬 인터페이스는 하부클래스의 로컬 인터페이스도 됩니다)
@Specializes
로 어노테이션된 Web Bean의 배치 유형은 상위클래스의 배치 유형보다 높은 우선 순위를 갖습니다
상위클래스를 특성화하는 활성화된 Web Bean이 없습니다.
이러한 조건을 위반할 경우, Web Bean 관리자는 초기화시 예외 처리를 넘기게 됩니다.
따라서, @Specializes
라고 어노테이션된 Web Bean이 배치되어 활성화된 시스템의 어떤 배치에서도 상위클래스는 절대로 호출되지 않음을 확인할 수 있습니다.