7.8. 替代 Bean
替代方案是其实施特定于特定客户端模块或部署方案的 Bean。
默认情况下,@ Alternative be an 被禁用。通过编辑 Bean .xml 文件,为特定的 Bean 存档启用它们。但是,此激活仅适用于该存档中的 bean。您可以使用 @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>
现在,使用替代的实现而不是原始实施。