2016-10-11 11 views
1

私のアプリケーションでは、サービスを使用するいくつかのBeanがあります。サービスには@Named("Name")と注釈が付けられ、@Injectが挿入されます。Javax:名前付きサービスの拡張

私にはサービスがあります。私はそれのためのインターフェイスと実装を持っています。 私のアプリケーションの別のモジュールでは、このサービスをさまざまな方法で使用できますが、いくつかの方法が異なる必要があり、新しい方法が必要です。だから私は最初のサービスを別のものに拡張したかったのです。

私はこのような何かを思い付いた:もちろん

Interface Service1 {...} 

@Named(Service1) 
Class Service1Impl implements Service1 {...} 

Interface SpecialService1 extends Service1 {...} 

@Named(SpecialService1) 
Class SpecialService1 extends Service1Impl implements SpecialService1 {...} 

私は私のサーバーの起動時にクラスの2つの試合があるので、私は、タイプService1とは予選Beanが存在しないというメッセージを取得Service1を実装します。

しかし、私はすべてのメソッドにアクセスするためにSpecialService1Service1を拡張する必要があると私は再びすべてを実装する必要がないようにSpecialService1ImplService1Implを拡張する必要があります。

私の豆で私はちょうどSpecialService1を注入し、Service1およびSpecialService1のすべての方法にアクセスしたいと思います。

このような構造をどのように働かせることができますか?

+0

あなたのBeanが 'Service1'と' SpecialService1'の両方であれば、 'SpecialService1'を登録する必要があります。 –

+0

あなたが何を意味するのか本当に理解していない。他の豆では、私はService1を注入する必要があります。別のBeanではSpecialService1が必要です。私は豆1つにつき1つだけを注入します。しかし、@Namedを両方のサービスの上に置いて、それらのうちの1つを注入できるようにする必要があります。 –

+1

いいえあなたはしません...あなたの 'SpecialService1'も' Service1'です...あなたは両方の役割をフルフィルするために 'SpecialService1'のインスタンスが必要です...本当に2つのインスタンスが必要な場合は、 '@修飾子'を使ってそれらを区別することができます...あなたの '@Service1'を' @ Primary'とマークして、デフォルトで使用され、もう1つが選択的に注入されるようにすることができます。 –

答えて

0

同僚が私にヒントをくれて、私はそれを働かせました。

私が追加しなければならないサービスのいずれかを注入したいところのどこでも@Qualifier("Service1")。そうすることで、彼はどのサービスを注入するかを知っています。

もっと洗練されたソリューションがありますか?そうでなければ、私はこれを質問の答えとして受け入れます。

編集:上記のコメントに記載されているとおり、Service1には@Primaryも使用されました。そうすれば、SpecialService1との注入にフラグを立てるだけです。@Qualifier

関連する問題