自动装配 spring 中的列表,无需配置

Autowiring a list in spring, without configuration

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

假设我有以下 classes:

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");
    }
}

我有 class

public class Aggregator {
    @Autowired
    private List<A> stuffDoers;
    private void doAllStuff() {
        for(A a:stuffDoers) {
            a.doStuff();
        }
    }
}

如何在不配置 XML 中的列表的情况下,将 A 的某些实现 自动连接 Aggregator 中?

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

@Autowired 始终适用于 class 的实例,而不适用于类型。您定义了 3 种类型:ABC,但尚未从它们创建任何实例。

要自动装配,您需要创建这些实例,并使用 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(不是列表)。有关详细信息,请参阅 Java-based container configuration

现在,Spring 将完成在这些包中查找类型为 A 的所有 bean 的工作,并使用所有三个 bean 正确填充 Aggregator class。

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


正如评论中所问,如果您只想拥有其中一些实例怎么办?

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

当然,如果您只需要 一个 bean,那么像往常一样,您必须使用 @Qualifier 自动装配它并指定 bean 名称。在这种情况下,您不使用 List,只使用 A.

类型的变量