我有2个豆子。
第一个是我在制作中使用的模型Model
。
@Named("model")
@RequestScoped
public class Model{
}
第二个是我用于测试的Model
的扩展名。
@Named("modelTest")
@RequestScoped
public class ModelTest extends Model{
}
如何强制CDI默认选择Model
?
答案 0 :(得分:2)
由于您想要更改给定类型的'default'bean并且您不想使用限定符,我假设原始bean不会被注入任何地方。因此,您可能会追求的是替代或专业化。
如果我们谈论替代,您需要使用@Alternative
注释标记新bean并“选择”它 - 可以在{{基于每个bean存档的基础上完成1}}或仅使用beans.xml
全局。这是一段代码:
@Priority(int)
使用选定的替代方案,无论何时注入先前的类型(@Named("modelTest")
@RequestScoped
@Alternative
@Priority(1) // "activates"/selects the alternative
public class ModelTest extends Model{
}
),CDI都会注入此替代方法(Model
),因为它也适合注入点。
辅助选项是专业化。它与替代品非常相似,但在原始bean被“丢弃”的方式上更加严格,您可以在CDI spec中阅读更多相关信息。专业化还附带限定符和bean名称继承(虽然不是范围!)。也没有必要选择bean(而不是替代品)。这是代码:
ModelTest
请注意,根据规范,bean一次只能有一个bean名称。因此,如果您继承一个名称并声明另一个名称,您将收到错误 - 相应地更改您的代码。