Java CDI select 没有优先权的备选方案

Java CDI select alternative without priority

我正在尝试通过 @Alternative.

将 DeltaSpike (LocaleResolver) 提供的默认实现替换为我自己的实现
@Alternative
@RequestScoped
public class ExampleLocaleResolver implements LocaleResolver {

}
<alternatives>
  <class>org.example.app.ExampleLocaleResolver</class>
</alternatives>

似乎使 ExampleLocaleResolver 成为所选 bean 的唯一方法是使用 @Priority@Specializes

例如,以下两个工作得很好:

@Priority(1)
@Alternative
@RequestScoped
public class MyLocaleResolver implements LocaleResolver {

}
@Specializes
@RequestScoped
public class MyLocaleResolver extends DefaultLocaleResolver {

}

我的理解是,使用 CDI 1.1+,应该可以用替代品覆盖库中的 bean,而无需任何黑客攻击。

有人可以帮我理解为什么我无法在没有 @Priorty 注释的情况下注入 @Alternative bean 吗?

(警告:我在@Alternative方面比较弱,但我认为我理解并能准确回答。)

我认为问题在于,如果不使用 @Priority,您只能对 bean 存档进行断言,并且您的 bean 存档与 DeltaSpike LocaleResolver 所在的 bean 存档不同来源。我的理解是in CDI 1.1+ the only way to cause application-wide @Alternative selection to happen is with the @Priority annotation.