7.8. 대체 빈
대안은 구현이 특정 클라이언트 모듈 또는 배포 시나리오에 고유한 빈입니다.
기본적으로 @Alternative 빈은 비활성화되어 있습니다. bean. xml 파일을 편집하여 특정 빈 아카이브에 대해 활성화됩니다. 그러나 이 활성화는 해당 아카이브의 빈에만 적용됩니다. @Priority 주석을 사용하여 전체 애플리케이션에 대한 대안을 활성화할 수 있습니다.
예제: 대체 옵션 정의
이 대안은 @Synchronous 및 @ Asynchronous 대안을 둘 다 사용하여 PaymentProcessor 클래스 구현을 정의합니다.
@Alternative @Synchronous @Asynchronous
public class MockPaymentProcessor implements PaymentProcessor {
public void process(Payment payment) { ... }
}예제: beans.xml을 사용하여 @Alternative 활성화
<beans
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd">
<alternatives>
<class>org.mycompany.mock.MockPaymentProcessor</class>
</alternatives>
</beans>
선택한 대안 선언
@Priority 주석을 사용하면 전체 애플리케이션에 대한 대안을 활성화할 수 있습니다. 대안은 애플리케이션의 우선 순위를 지정할 수 있습니다.
-
관리 빈 또는 세션 빈의 빈 클래스에
@Priority주석을 배치하거나 -
제작자 메서드, 필드 또는 리소스를 선언하는 빈 클래스에
@Priority주석을 배치합니다.
7.8.1. 삽입을 대체로 덮어쓰기
대체 빈을 사용하여 기존 빈을 재정의할 수 있습니다. 동일한 역할을 채우지만 다른 기능을 채우는 클래스를 연결하는 방법으로 간주할 수 있습니다. 기본적으로 비활성화되어 있습니다.
이 작업은 대안을 지정하고 활성화하는 방법을 보여줍니다.
삽입 덮어쓰기
이 작업에서는 프로젝트에 TranslatingWelcome 클래스가 이미 있다고 가정하지만 "mock" TranslatingWelcome 클래스로 재정의하려고 합니다. 실제 빈 을 사용할 수 없는 테스트 배포의 사례입니다.
대안을 정의합니다.
@Alternative @Translating public class MockTranslatingWelcome extends Welcome { public String buildPhrase(string city) { return "Bienvenue à " + city + "!"); } }META-INF/beans.xml 또는파일에 정규화된 클래스 이름을 추가하여 대체 구현을 활성화합니다.WEB-INF/beans.xml<beans> <alternatives> <class>com.acme.MockTranslatingWelcome</class> </alternatives> </beans>
이제 원래 구현 대신 대체 구현이 사용됩니다.