既然你想改变给定类型的'默认'bean,并且你不想使用限定符,我假定原始bean不会被注入到任何地方。因此,你可能以后是替代或专业化。
如果我们谈论替代,你需要@Alternative
标注来标记新豆还“选择”它 - 这可以在每一个bean档案基础上beans.xml
完成或者干脆用全球@Priority(int)
。下面的代码片段:
@Named("modelTest")
@RequestScoped
@Alternative
@Priority(1) // "activates"/selects the alternative
public class ModelTest extends Model{
}
与选择的替代方案,只要你注入之前的类型(Model
),CDI反而会注入这种替代(ModelTest
),因为它适合注射点为好。
次要选项是专业化。它与备选方案非常相似,但在原始豆被“丢弃”的方式上更加严格,您可以在CDI spec中阅读更多关于此的信息。专业化还带有限定符和bean名称继承(不在范围!)。也没有必要选择bean(而不是替代品)。以下是代码:
@RequestScoped
@Specializes
public class ModelTest extends Model{
// bean name with be inherited automatically as "model"
}
请注意,根据规范,bean一次只能有一个bean名称。因此,如果您继承一个名称并声明另一个名称,则会出现错误 - 相应地更改您的代码。
无论如何,测试不应该扩展它所测试的类。 – Tom
它不是一个junit测试。它是一个不同的测试。 Web组件的自定义测试。但它不重要。因为如果我只有2个接口的实现,就会出现这个问题。 – user2914191
看看[https://dzone.com/articles/java-ee6-cdi-named-components] – Egl