既然你想改變給定類型的'默認'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