Spring 基于其他 beans 列表的 bean 创建

Spring Bean creation based on a list of other beans

任何人都可以解释 Spring 在创建依赖于其他 bean 列表的 bean 时如何定义 bean 创建机制?最好显示 Spring 规范的定义部分。

代码如下:

public interface Test {
}

@Service
public class TestImpl1 implements Test{
}

@Service
public class TestImpl2 implements Test{
}

public class TestContainer {
    List<Test> testList;
    TestContainer() {
        testList = new ArrayList<>();
    }

    public void addTest(Test test) {
        testList.add(test);
    }
}

然后

@Bean
public TestContainer testContainer(List<Test> testList) {
    TestContainer testContainer = new TestContainer();
    for (Test test : testList) {
        testContainer.addTest(test);
    }
    return testContainer;
}

真正的问题是:在为 TestContainer 创建 bean 时,Spring 如何确定 List testList 中应该包含什么?

这看起来像您要查找的内容:

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-class

您没有具体说明您想了解关于 bean 创建的哪些内容,但这是您至少应该了解的内容。默认情况下,所有 bean 都是单例范围的(在容器生命周期中只创建一次,并且对于所有后续请求返回相同的实例)。所有单例范围的 bean 都是急切创建的。如果单例 bean 依赖于其他一些 bean(需要它们进行实例化),那么这些其他 bean 将在它之前用 it/right 实例化,不管它们是否是单例,是否标记为惰性。

这是我认为在他们网站上的 spring 文档的一部分。寻找它。整个 spring 文档值得一读,即使阅读时间很长 (https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#spring-core)

但大多数情况下,spring 会首先读取所有 XML、注释和其他配置数据源,并获取要初始化的 bean 列表。然后它将获得构建树的 bean 之间的依赖关系列表。由于需要先初始化依赖,所以初始化有明显的顺序。

最重要的是,您可以为 bean 设置自己的优先级,例如,您可以首先或最后初始化一些 bean。

对于您的具体情况,spring 将检查代码源并使用 Java 反射 API 来确定您需要一组接口测试实现。所以 spring 会查找所有匹配的已定义 bean,并且 return 它们不会比这更复杂。

它主要使用图形数据结构的概念,其中 bean 成为图形的节点,并使用拓扑排序对其进行解析。