4

通常、修飾されたコンポーネントは、同じ修飾子を持つ注釈付きフィールドに注入されます。

@Component        class Apple1 implements IApple {}
@Component @Black class Apple2 implements IApple {}

class User {
    @Inject        IApple apple;        // -> Apple1
    @Inject @Black IApple blackApple;   // -> Apple2
    @Inject @Red   IApple redApple;     // -> Error: not defined
}

私が欲しいのは、特定の修飾子を持つコンポーネントが定義されていない場合、デフォルトのコンポーネントを指定したいので、redApple上記の例ではのインスタンスが注入されますApple1

出来ますか?または、Spring DIに特定の修飾子マッチング戦略を実装できますか?

** 編集 **

サブクラスが機能することはわかっていますが、これは質問を説明するための例であるため、ここではサブクラスは適用されません。

4

1 に答える 1

4

Beanが存在しない場合に、修飾を使用して何かを注入しようとすると、次のよう @Inject @Red IApple redApple;になりますNoSuchBeanDefinitionException

この例外は、次を使用するかどうかに関係なく発生します。

  • @Inject
  • @リソース
  • @Autowire

理由は単純です。SpringDIの最初の検索で、すべての自動配線候補が決定されます。

  • 正確に1つある場合は、この候補を使用します
  • 候補がない場合は、NoSuchBeanDefinitionExceptionが発生します
  • 複数ある場合は、候補の中からプライマリー候補を決定しようとします。

@See org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency

行785..809(3.0.4.RELEASE)

したがって、あなたがする必要があるのは、フォールバック(Apple)を候補のセットに入れることですが、他の候補がない場合にのみ使用されるようにしてください。Beanをフォールバックまたは重要度の低いものとしてマークする方法はないため、通常のBeanをより重要なものとしてマークする必要があります@primary

したがって、(証明された)ソリューションは注釈を付けることになります

  • 黒と赤のアップルと@Blackと@Red、そして@Primary。
  • デフォルトのフォールバックApple(Apple1)には、@ Redと@Blackがありますが、@Primaryはありません。

例:

@Component @Red @Black public class Apple1 implements IApple {} //fall back
@Component @Black @Primary public class Apple2 implements IApple {}

@Component public class AppleEater {
  @Inject @Black IApple blackApple; // -> Apple2
  @Inject @Red IApple redApple; // -> Apple1
}

考えられる改善:フォールバックBeanにすべてのアノテーション(@ Black、@ Red、@ AllOtherStangeColors)を追加したくない場合AutowireCandiateResolverは、フォールバックBeanをすべての候補リストに追加するように独自のアノテーションを実装してみてください。必要なタイプ(Apple) @参照ドキュメントを参照:3.9.4 CustomAutowireConfigurer

于 2011-03-16T12:39:21.657 に答える