Java 弹簧罐';是否为列表类型的Bean解析@Bean依赖关系?

Java 弹簧罐';是否为列表类型的Bean解析@Bean依赖关系?,java,spring,Java,Spring,显示我的问题的简单测试类: import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.spri

显示我的问题的简单测试类:

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringTest.OptionalConfiguration.class)
public class SpringTest {
    static class Item extends Object {}

    @Configuration
    static class OptionalConfiguration {
        @Bean
        List<Item> someString() {
            return new ArrayList<>();
        }
        @Bean
        Object foo(List<Item> obj) {
            return new Object();
        }
    }

    @Test
    public void testThis() {

    }
}
import java.util.ArrayList;
导入java.util.List;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.test.context.ContextConfiguration;
导入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(class=SpringTest.OptionalConfiguration.class)
公开课春季考试{
静态类项扩展对象{}
@配置
静态类可选配置{
@豆子
列出someString(){
返回新的ArrayList();
}
@豆子
对象foo(列表obj){
返回新对象();
}
}
@试验
public void testThis(){
}
}
结果:

org.springframework.beans.factory.noSuchBean定义异常:否 为依赖项找到[SpringTest$Item]类型的合格bean [SpringTest$Item的集合]:至少需要1个bean 符合此依赖项的autowire候选条件。附属国 注释:{}

如果我从
列表
更改为
项目
,事情就会正常进行

这是故意的吗?有解决办法吗?我需要提供项目的
列表
——有时为空,有时为项目,具体取决于运行时配置

我知道,如果我用type Item指定bean,那么自动连接
List
会起作用。但是,我希望有一个类型为
List
的bean(如果我没有,则是
List


使用Spring4.2.4.

该代码段在Spring4.3+中可以正常工作。美国

也就是说,从4.3开始,集合/映射和数组类型可以匹配 通过Spring的@Autowired类型匹配算法 也用于
@Bean
参数解析],只要元素 类型信息保存在
@Bean
返回类型签名或 集合继承层次结构。在这种情况下,可以使用限定符值 用于在相同类型的集合中进行选择,如中所述 上一段

4.3之前,当Spring看到

@Bean
Object foo(List<Item> obj) {
直接使用缓存的bean工厂方法,
someString

这个

@Resource(name=“someString”)
私人清单项目;
//并在配置中需要的任何位置访问“项目”
因为

如果您打算用名称表示注释驱动的注入,请不要 主要使用@Autowired,即使在技术上能够引用 通过@Qualifier值创建一个bean名称相反,使用JSR-250 @资源注释,它在语义上定义为标识 特定目标组件的唯一名称,以及声明的类型 与匹配过程无关。@Autowired的 不同的语义:在按类型选择候选bean之后 指定的字符串限定符值将在这些限定符中考虑 仅键入选定的候选人,例如匹配“帐户”限定符 针对使用相同限定符标签标记的bean


Spring源代码通常非常清晰——可能值得查看该异常的堆栈跟踪,找到它查找符合条件的bean的代码,并查看它的功能。开源万岁!使用
@Qualifier
有什么好处吗?@CollinD-我刚刚试过使用
@Qualifier
-没有,没有帮助。你是对的。在我看来,在4.3之前,我尝试过的东西不起作用似乎很疯狂——Spring 4.2.6并没有那么老。@eis我想他们认为很少需要声明集合类型的bean,因此从未实现过它。它更有可能声明一堆
Foo
Bean,并需要将它们全部注入。我发现的另一个解决方法是
@Bean Object Foo(ApplicationContext ctx){List List List List=ctx.getBean(“someString”,List.class);return new Object();}
-不太好,但至少我还能有同样的机制
@Bean
Object foo() {
    List<Item> someString = someString();
    return new Object();
}
@Resource(name = "someString")
private List<Item> items;
// and access 'items' wherever you need it in the configuration