(春3.2.5を使用して)次のコードを考える:Javaの春のジェネリックコレクションの依存
@org.springframework.context.annotation.Configuration
public class MyConfiguration {
@Bean
public MyClass myClass(@Qualifier("messageFeeders") List<MessageFeeder> messageFeeders) {
return new MyClass(messageFeeders);
}
@Bean
public MessageFeederSubclassOne messageFeeder1() {
return new MessageFeederSubclassOne();
}
@Bean
public MessageFeederSubclassTwo messageFeeder2() {
return new MessageFeederSubclassTwo();
}
@Bean
@Qualifier("messageFeeders")
public List<MessageFeeder> messageFeeders(MessageFeederSubclassOne messageFeeder1, MessageFeederSubclassTwo messageFeeder2) {
return ImmutableList.of(messageFeeder1, messageFeeder2);
}
}
私はこの例外を取得:
今org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myClass' defined in class path resource [com/company/configuration/MyConfiguration.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [java.util.List]: : No qualifying bean of type [com.company.messagebroker.MessageFeeder] found for dependency [collection of com.company.messagebroker.MessageFeeder]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=messageFeeders)}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:738)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.company.messagebroker.MessageFeeder] found for dependency [collection of com.company.messagebroker.MessageFeeder]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=messageFeeders)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:988)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:816)
、私は春が発見しようとして実現MessageFeeder型のBeanをこのリストに入れておいてください。しかし、私が望むのは、修飾子が実際に自分が定義したリストを実際に挿入することです。
DefaultListableBeanFactoryコードを見ると、修飾子は完全に無視されているようです。
また、なぜ失敗するのですか?修飾子を無視しても、MessageFeederを継承して使用する2つのBeanを検出してはいけませんか?
私はそれを使用する唯一の人ではないので、私はmessageFeeders beanを変更したくないと思います。 Springに修飾子を考慮させる簡単な方法はありますか?
stacktraceから明らかに 'MyClass'doに問題があります。リスト引数を持つコンストラクタもありますか? –
もちろんあります。それ以外の場合は、イベントはコンパイルされません。あなたはその誤解を誤解しました。 MyClassをまったく参照していないのですが、上記のコードで定義されているBeanの依存関係を満たすことに問題があります。 – Tolstoyevsky