7.8. 替代 Bean

替代方案是其实施特定于特定客户端模块或部署方案的 Bean。

默认情况下,@ Alternative be an 被禁用。通过编辑 Bean .xml 文件,为特定的 Bean 存档启用它们。但是,此激活仅适用于该存档中的 bean。从 CDI 1.1 开始,可以使用 @Priority 注释为整个应用启用替代选项。

示例:定义替代方案

这种替代方案定义了 PaymentProcessor 类的实施,该类同时使用 @Synchronous@Asynchronous 替代方案:

@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 注释放在受管 Bean 或会话 Bean 的 Bean 类上,或者
  • 通过将 @Priority 注释放置到 bean 类,以声明制作者方法、字段或资源。

7.8.1. 使用替代方案覆盖 Injection

您可以使用备用 Bean 来覆盖现有的 Bean。它们可以想象成是插入同一角色的类的方法,但功能不同。默认情况下禁用它们。

此任务显示如何指定和启用替代方案。

覆盖 Injection

此任务假定项目中已有一个 TranslatingWelcome 类,但您想要使用"mock" TranslatingWelcome 类覆盖它。测试部署就是如此,因此无法使用 真实的转换器 Bean。

  1. 定义备选方案.

    @Alternative
    @Translating
    public class MockTranslatingWelcome extends Welcome {
      public String buildPhrase(string city) {
        return "Bienvenue à " + city + "!");
      }
    }
  2. 通过将完全限定的类名称添加到您的 META-INF/beans.xmlWEB-INF/beans.xml 文件来激活替换实施。

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

现在,使用替代的实现而不是原始实施。