【问题标题】: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&lt;Foo&gt; 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&lt;Foo&gt; 时,Spring 会找到所有 Foo 类型的 bean,创建一个包含这些 bean 的 List,然后注入该列表。

      documentation about Autowired 解释它,顺便说一句:

      还可以通过将注释添加到需要该类型数组的字段或方法来从 ApplicationContext 提供特定类型的所有 bean

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 2017-04-29
        • 2012-03-14
        • 1970-01-01
        • 2018-11-06
        • 2011-03-22
        • 1970-01-01
        • 2018-06-15
        相关资源
        最近更新 更多