gpt4 book ai didi

java - java spring中的通用集合依赖

转载 作者:行者123 更新时间:2023-11-30 02:48:50 28 4
gpt4 key购买 nike

给出以下代码(使用 spring 3.2.5):

@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)

现在,我意识到 spring 正在尝试查找 MessageFeeder 类型的 bean 并将它们全部填充到此列表中,但我希望限定符将强制它实际注入(inject)我自己定义的列表。

查看DefaultListableBeanFactory代码,它似乎完全忽略了限定符。

另外,为什么会失败?即使忽略限定符,它不应该检测从 MessageFeeder 继承的两个 bean 并使用它们吗?

我不想更改 messageFeeders bean,因为我不是唯一使用它的人。有没有什么简单的方法可以让Spring考虑限定符?

最佳答案

这是您的解决方案:

@Bean
@Autowired
@Qualifier("messageFeeders")`
public MyClass myClass(List<MessageFeeder> messageFeeders)
{
return new MyClass(messageFeeders);`
}

说明:

我首先尝试在 Spring 4.3.2 版本上执行此操作,并且按照您定义的方式运行得很好。但是,我将 Spring 依赖项更改为版本 3.2.5,并且收到了您的异常。

@Autowired 是通过注释注入(inject) Bean 的正确方法,它是通过类型来实现的。在 @Autowired 注释的情况下,IOC 容器通过类型识别来注入(inject) Bean。

现在,如果我们的 IOC 容器中有多个相同类型的 Bean,该怎么办?它如何知道要注入(inject)哪个bean?

简单地说,通过@Qualifier注释。

但是您仍然需要使用 @Autowired 注释。

关于java - java spring中的通用集合依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39330050/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com