在spring中自动关联列表,无需配置

在spring中自动关联列表,无需配置,spring,autowired,Spring,Autowired,如何在没有配置的情况下使用java自动连接列表 假设我有以下课程: public abstract class A { public abstract doStuff(); } public class B extends A { @Override public void doStuff() { System.out.println("I'm B"); } } public class C extends A { @Override

如何在没有配置的情况下使用java自动连接列表

假设我有以下课程:

public abstract class A {
    public abstract doStuff();
}

public class B extends A {
    @Override
    public void doStuff() {
        System.out.println("I'm B");
    }
}

public class C extends A {
    @Override
    public void doStuff() {
        System.out.println("I'm C");
    }
}
我有课

public class Aggregator {
    @Autowired
    private List<A> stuffDoers;
    private void doAllStuff() {
        for(A a:stuffDoers) {
            a.doStuff();
        }
    }
}
公共类聚合器{
@自动连线
私人名单;
私有void doAllStuff(){
对于(A:玩偶者){
a、 doStuff();
}
}
}
在不配置XML列表的情况下,如何将A的一些实现自动连接到聚合器中


编辑:我正在寻找一种能够控制列表成员的方法

@Autowired
始终使用类的实例,而不是类型。您已经定义了3种类型:
A
B
C
,但尚未从中创建任何实例

要自动连线,您需要创建这些实例,并向Spring注册它们。这就是XML配置或Java配置的用武之地。它基本上是创建Spring注册实例的一种简短形式。因此,您可以指定:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfiguration {

    @Bean
    public B someA() {
        return new B();
    }

    @Bean
    public C anotherA() {
        return new C();
    }

    @Bean
    public B evenMoreA() {
        return new B();
    }
}
这将为您提供3个独立的实例bean(不是列表)。有关更多详细信息,请参阅

现在,Spring将在这些包中查找
A
类型的所有bean,并用这三个bean正确地填充您的
聚合器

注意:这些bean不需要在同一个文件中。它们可以在
@ComponentScan
包中的任何位置声明


正如一篇评论中提到的,如果您只想拥有其中的一些实例,该怎么办

如果您只想将一些bean添加到列表中,那么情况就更加棘手了。您需要将被排除的bean移动到不同包中的一个单独的
@Configuration
类中。您不应该将该新包添加到Spring
@ComponentScan
包中,因此Spring将找不到要添加到列表中的bean。据我所知,这是唯一的办法


当然,如果您只想要一个bean,那么像往常一样,您必须使用
@Qualifier
自动连接它并指定bean名称。在本例中,您不使用
列表
,只使用
a

类型的变量,我问过如何在没有配置的情况下使用java来实现这一点。@user1050389 ah fair,将添加一个JavaConfig示例。您提到它提供了三个独立的bean,而不是列表。这些独立bean会自动连接成一个列表吗?否则它不能回答这个问题。好的,我看到你也提到了。谢谢但是,如果我只想拥有其中的一些实例呢?@user1050389作为编辑回答了您的补充问题。检查答案。