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 成为图形的节点,并使用拓扑排序对其进行解析。
任何人都可以解释 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 成为图形的节点,并使用拓扑排序对其进行解析。