指定された型の 'default' beanを変更したいし、修飾子を使いたくないので、元のbeanをどこにも挿入しないと仮定します。したがって、あなたがたどったのはの代替品または専門店です。
我々はおよそ選択肢を話した場合、あなたは@Alternative
注釈に新しいBeanをマークしても、それを「選択」する必要があります - @Priority(int)
とbeans.xml
または単にグローバルに豆のアーカイブごとに行うことができるという。ここでは、コードスニペットは、次のとおりです。
@Named("modelTest")
@RequestScoped
@Alternative
@Priority(1) // "activates"/selects the alternative
public class ModelTest extends Model{
}
選択された代替を使用すると、以前のタイプ(Model
)を注入したときに、それは同様に注入点に合うように、CDIではなく、(ModelTest
)この代替を注入します。
セカンダリオプションは特化です。代替案と非常によく似ていますが、元のBeanが「破棄」されるように厳密になっています。詳しくはCDI specを参照してください。スペシャライゼーションには、修飾子とBeanの名前の継承(もありますが、)があります。 Beanを選択する必要もありません(代替手段とは対照的に)。
@RequestScoped
@Specializes
public class ModelTest extends Model{
// bean name with be inherited automatically as "model"
}
注:Beanは、仕様に従って、一度に1つのBean名しか持つことができません。したがって、ある名前を継承して別の名前を宣言すると、エラーが発生します。それに応じてコードを変更します。
テストは、テストするクラスを拡張するべきではありません。 – Tom
そのjunitテストではありません。その別のテスト。 Webコンポーネントのカスタムテスト。それは問題ではありません。なぜなら、私は単にインターフェイスの2つの実装を持っていただけで、この問題が発生するからです。 – user2914191
[https://dzone.com/articles/java-ee6-cdi-named-components]を見てみましょう – Egl