如何在没有配置的情况下使用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
中?
答案 0 :(得分:3)
@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(不是列表)。有关详细信息,请参阅Java-based container configuration。
现在,Spring将在这些包中找到A
类型的所有bean,并正确填充所有三个bean的Aggregator
类。
注意:这些bean不需要位于同一个文件中。它们可以在@ComponentScan
包中的任何位置声明。
如评论中所述,如果您只想拥有其中一些实例,该怎么办?
如果您只想将某些bean 添加到列表中,情况会更加棘手。您需要将已排除的bean移至不同包中的单独@Configuration
类。您不应该将新包添加到Spring @ComponentScan
包中,因此Spring不会找到要添加到列表中的bean。据我所知,这是唯一的方法。
当然,如果你只想要一个bean ,那么像往常一样,你必须使用@Qualifier
自动装配它并指定bean名称。在这种情况下,您不能使用List
,只使用A
类型的变量。