Spring按类型列出bean

Jef*_*rey 8 java spring autowired

在Spring中是否有一种方法可以使用类型及其任何子类型的所有bean自动填充列表?我有一个setter方法,看起来像:

setMyProp(List<MyType> list)
Run Code Online (Sandbox Code Playgroud)

我想在MyType的任何bean和MyType的所有子类中自动装配.

谢谢,杰夫

ska*_*man 25

是的,你可以做到这一点.春天的文档说:

通过将注释添加到期望该类型的数组的字段或方法,还可以从ApplicationContext提供特定类型的所有bean.

请注意,它表示您需要一个数组,而不是一个列表.这是有道理的,因为泛型类型擦除意味着列表可能无法在运行时工作.但是,请进行以下单元测试:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  

    <bean class="test.Test.TypeB"/>
    <bean class="test.Test.TypeC"/>
    <bean class="test.Test.TypeD"/>
</beans>
Run Code Online (Sandbox Code Playgroud)

而这个单元测试:

package test;

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class Test {

    private @Autowired List<TypeA> beans;

    @org.junit.Test
    public void test() {
        assertNotNull(beans);
        assertEquals(2, beans.size());
        for (TypeA bean : beans) {
            assertTrue(bean instanceof TypeA);
        }
    }       

    public static interface TypeA {}
    public static class TypeB implements TypeA {}
    public static class TypeC extends TypeB {}
    public static class TypeD {}

}
Run Code Online (Sandbox Code Playgroud)

所以正式,你应该自动装配TypeA[],而不是List<TypeA>,但List工作得很好.


tan*_*ens 5

如果从应用程序代码中填充列表是可以接受的,而不是从bean定义文件中填充,则可以使用org.springframework.beans.factory.xml.XmlBeanFactory并询问它" getBeansOfType( MyType.class )".这将为您提供所有类型(和子类型)的bean MyType.