[英]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 都是 singleton 范围的(在容器生命周期中只创建一次,并且对于所有后续请求,返回相同的实例)。 所有 singleton 范围的 bean 都是急切创建的。 如果 singleton bean 依赖于其他一些 bean(需要它们进行实例化),那么那些其他 bean 将用它/在它之前实例化,不管它们是否是单例,标记为懒惰与否。
这是我认为在他们的网站上的 spring 文档的一部分。 寻找它。 整个 spring 文档都值得一读,即使是长篇阅读( https://docs.spring.io/spring/docs#spring-core/spring-framework )
但大多数情况下,spring 将首先读取所有 XML、注释和其他配置数据源,并获取要初始化的 bean 列表。 然后它会得到一个构建树的bean之间的依赖列表。 由于需要首先初始化依赖项,因此初始化的顺序很明显。
最重要的是,您可以为 bean 设置自己的优先级,以便您可以首先或最后初始化一些 bean。
对于您的特定情况,spring 将检查代码源,并使用 Java 反射 API 来确定您需要接口测试实现的集合。 因此 spring 将查找所有匹配的已定义 bean,并返回不比这更复杂的它们。
它主要使用图形数据结构的概念,其中 bean 成为图形的节点,并使用拓扑排序来解决它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.