自动装配 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 种类型: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
class。
注意:这些 bean 不需要在同一个文件中。它们可以在您的 @ComponentScan
包中的任何位置声明。
正如评论中所问,如果您只想拥有其中一些实例怎么办?
如果您只想将 一些 bean 添加到您的列表中,情况就比较棘手了。您需要将排除的 bean 移动到单独的 @Configuration
class,在 不同的包 中。您不应将该新包添加到 Spring @ComponentScan
包中,因此 Spring 将找不到要添加到列表中的那些 bean。据我所知,这是唯一的方法。
当然,如果您只需要 一个 bean,那么像往常一样,您必须使用 @Qualifier
自动装配它并指定 bean 名称。在这种情况下,您不使用 List
,只使用 A
.
类型的变量
如何在没有配置的情况下使用 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 种类型: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
class。
注意:这些 bean 不需要在同一个文件中。它们可以在您的 @ComponentScan
包中的任何位置声明。
正如评论中所问,如果您只想拥有其中一些实例怎么办?
如果您只想将 一些 bean 添加到您的列表中,情况就比较棘手了。您需要将排除的 bean 移动到单独的 @Configuration
class,在 不同的包 中。您不应将该新包添加到 Spring @ComponentScan
包中,因此 Spring 将找不到要添加到列表中的那些 bean。据我所知,这是唯一的方法。
当然,如果您只需要 一个 bean,那么像往常一样,您必须使用 @Qualifier
自动装配它并指定 bean 名称。在这种情况下,您不使用 List
,只使用 A
.