【问题标题】:How does Spring framework autowire a collectionSpring框架如何自动装配一个集合
【发布时间】:2016-10-21 06:25:07
【问题描述】:
我从未见过自动装配的集合:
@Service
public class SomeFactory {
@Autowired
private List<Foo> foos;
@PostConstruct
public void init() {
for(Foo foo: foos) {
//do something
}
}
}
在 init() 方法中,我可以看到 foos 已经有几个条目。我猜 Spring 知道谁应该是 foos 的入口。但是,怎么做?如果我想在 foos 中添加一个 Foo 对象应该怎么做?需要在属性文件中配置,还是有其他想法?
【问题讨论】:
标签:
java
spring
annotations
autowired
【解决方案1】:
在 init() 方法中,我可以看到 foos 已经有几个条目。我猜 Spring 知道谁应该是 foos 的入口。但是,怎么做?
在创建应用程序上下文/Bean 工厂时,默认情况下(如果没有使用惰性初始化或非单例范围另行指定),也会创建所有 bean。 应用上下文知道这些 bean。因此,当我们尝试 @Autowire 特定类型 bean 的集合(如 private List<Foo> foos;)时,Spring 会查找所有 foo,将它们添加到列表并注入到依赖 bean。
如果我想在 foos 中添加一个 Foo 对象应该怎么做?需要在属性文件中配置,还是有其他想法?
有多种方法可以做到这一点。可以根据需要选择一个合适的选项。
- 在 bean 配置
XML 文件中声明 bean。灵活的。但您可能不喜欢在 XML 中执行此操作。
-
@Component bean 类上的注释。配置了组件扫描的 Spring 将扫描该类。没有 XML,但灵活性较差。 Bean 类定义和声明是紧密耦合的。无法在不同的 Application Context 中创建 @Component bean。
-
@Bean 方法上的注释,该方法返回 @Configuration 注释类内的 bean。首选。 Bean 类定义和声明仅通过注解进行解耦和完成。我们也可以从不同的Application Context 中的方法创建@Bean 注释bean。
【解决方案2】:
Spring 的 BeanFactory 基本上是 bean 的注册表。这些 bean 可以使用 XML 声明,或者使用 Configuration 类中的 @Bean-annotated 方法,或者使用包扫描自动发现。
当您请求 List<Foo> 时,Spring 会找到所有 Foo 类型的 bean,创建一个包含这些 bean 的 List,然后注入该列表。
documentation about Autowired 解释它,顺便说一句:
还可以通过将注释添加到需要该类型数组的字段或方法来从 ApplicationContext 提供特定类型的所有 bean