Beanが存在しない場合に、修飾を使用して何かを注入しようとすると、次のよう
@Inject @Red IApple redApple;
になりますNoSuchBeanDefinitionException
。
この例外は、次を使用するかどうかに関係なく発生します。
理由は単純です。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