无需配置即可在spring中自动装配列表

时间:2016-10-09 07:26:34

标签: 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
    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();
        }
    }
}

如何在不配置XML列表的情况下的某些实现自动装配到Aggregator中?

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

1 个答案:

答案 0 :(得分:3)

@Autowired始终适用于类的实例,而不是类型。您已定义了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类。

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

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

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

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