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 클래스로 재정의하려고 합니다. 실제 을 사용할 수 없는 테스트 배포의 사례입니다.

  1. 대안을 정의합니다.

    @Alternative
    @Translating
    public class MockTranslatingWelcome extends Welcome {
      public String buildPhrase(string city) {
        return "Bienvenue à " + city + "!");
      }
    }
  2. META-INF/beans.xml 또는 WEB-INF/beans.xml 파일에 정규화된 클래스 이름을 추가하여 대체 구현을 활성화합니다.

    <beans>
      <alternatives>
        <class>com.acme.MockTranslatingWelcome</class>
      </alternatives>
    </beans>

이제 원래 구현 대신 대체 구현이 사용됩니다.