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。
定义备选方案.
@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>
现在,使用替代的实现而不是原始实施。