Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSpring中的泛型集合依赖_Java_Spring - Fatal编程技术网

JavaSpring中的泛型集合依赖

JavaSpring中的泛型集合依赖,java,spring,Java,Spring,给出以下代码(使用弹簧3.2.5): 现在,我意识到spring正试图找到MessageFeeder类型的bean并将它们全部填入这个列表中,但我希望限定符将强制它实际注入我自己定义的列表 查看DefaultListableBeanFactory代码,它似乎完全忽略了限定符 还有,为什么它会失败?即使忽略限定符,它也不应该检测从MessageFeeder继承并使用它们的两个bean吗 我不想更改messageFeeders bean,因为我不是唯一使用它的人。有什么简单的方法可以让Spring考

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

现在,我意识到spring正试图找到MessageFeeder类型的bean并将它们全部填入这个列表中,但我希望限定符将强制它实际注入我自己定义的列表

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

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


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

尝试使用
@Resource
,因为这可能会解决问题

@Bean
@Resource(name = "messageFeeders") 
public MyClass myClass(List<MessageFeeder> messageFeeders) {
    return new MyClass(messageFeeders);
}
@Bean
@资源(name=“messageFeeders”)
公共MyClass MyClass(列表消息馈送器){
返回新的MyClass(messageFeeders);
}

为消息馈送器列表创建一个新的包装器类,将bean创建更改为使用新类,然后将“@Autowired”添加到构造函数调用中

class MessageFeederList extends ArrayList<MessageFeeder>{}

@Bean
public MessageFeederList messageFeeders(
    MessageFeederSubclassOne messageFeeder1, 
    MessageFeederSubclassTwo messageFeeder2){
    return ImmutableList.of(messageFeeder1, messageFeeder2);
}

@Bean
public MyClass myClass(@Autowired MessageFeederList messageFeeders) {
    return new MyClass(messageFeeders);
}
class MessageFeederList扩展了ArrayList{}
@豆子
公共消息馈送器列表消息馈送器(
MessageFeederSubclassOne messageFeeder1,
MessageFeederSubClass2 messageFeeder2){
返回ImmutableList.of(messageFeeder1,messageFeeder2);
}
@豆子
公共MyClass MyClass(@Autowired MessageFeederList messageFeeders){
返回新的MyClass(messageFeeders);
}
以下是您的解决方案:

@Bean
@Autowired
@Qualifier("messageFeeders")`
public MyClass myClass(List<MessageFeeder> messageFeeders) 
{
    return new MyClass(messageFeeders);`
}
@Bean
@自动连线
@限定符(“messageFeeders”)`
公共MyClass MyClass(列表消息馈送器)
{
返回新的MyClass(messageFeeders)`
}
说明:

我第一次尝试在SpringVersion4.3.2上实现它,它按照您定义的方式工作得很好。但是,我将我的Spring依赖项更改为3.2.5版,并且收到了您的异常

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

现在,如果我们的IOC容器中有多个相同类型的bean呢?它如何知道注入哪个bean

简单地说,通过
@限定符
注释


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

从stacktrace中清除您在
MyClass
中遇到的问题您甚至有带列表参数的构造函数吗?当然有。否则将无法编译此事件。你误解了错误。它根本不是指MyClass,问题在于满足上面代码中定义的bean的依赖关系……你是指javax.annotation.Resource吗?如果是这样,它似乎不能应用于参数。另外,它应该是@Resource(name=“messageFeeders”)谢谢,我意识到这个解决方案会起作用,但正如我所说的,我不想更改messageFeeders bean,因为它需要更改很多能够使用它的地方(通过直接调用context.getBean(“messageFeeders”))。在这种情况下,只需手动将这两个子类注入MyClass bean就更简单了
class MessageFeederList extends ArrayList<MessageFeeder>{}

@Bean
public MessageFeederList messageFeeders(
    MessageFeederSubclassOne messageFeeder1, 
    MessageFeederSubclassTwo messageFeeder2){
    return ImmutableList.of(messageFeeder1, messageFeeder2);
}

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