8

CDIでは、これを行うことができます:

// Qualifier annotation
@Qualifier
@inteface Specific{}

interface A {}

class DefaultImpl implements A {}

@Specific
class SpecificImpl implements A {}

そして、クラスで:

@Inject
A default;

@Inject
@Specific
A specific;

これは、@Default修飾子を指定せずに注入ポイントに自動的に割り当てられる修飾子のために機能します。

しかし、私はSpringで作業していて、それを実行できませんでした.

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException

問題は、「デフォルト」のインジェクション (修飾子なし) が、変更できない多くのコードで既に使用されており、別の可能な実装をAユーザーに提供する必要があることです。

新しい実装を Bean 名で注入できることは承知していますが、それは避けたいと思います。

春にそれを達成するのに役立つものはありますか?

4

2 に答える 2

16

誰かが @Primary がまさにこれを行うと私に指摘しました。私は試してみましたが、完全に動作します:

@Primary
class DefaultImpl implements A {}

私の場合、 DefaultImpl は xml にありました:

<bean id="defaultImpl" class="DefaultImpl" primary="true"/>
于 2013-10-28T19:02:56.180 に答える
0

これをコメントとして追加することもできましたが、私の要点を説明するためにフォーマット付きのコードを追加したかったので、明示的な回答を追加しています。

あなたが言ったことに加えて、次の行に沿って、Spring 内でも特定のメタアノテーションを実際に活用できます。

この方法@Specificで Spring 固有のアノテーションを使用して再定義します。org.springframework.beans.factory.annotation.Qualifier

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Qualifier
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Primary
public @interface Specific {
}

特定の注釈に注釈を付け@Primaryました。

これを配置すると、古いコードが機能するはずです。

@Specific
class DefaultImpl implements A {}
于 2013-10-28T20:19:07.463 に答える