我是 Spring 的初学者,我在理解这两者的工作原理时遇到了问题。我将通过示例来解决我的问题。
我们有一个带有 Spring Core 模块的项目,在那个项目中,我们有两个@Component
在不同包中注释的类和一个在第三个包中的主类。
现在我们创建了三个不同的@Configuration
类,在一个类中,我们指定@ComponentScan(package with first @Component annotated class)
将其称为 config1,在几秒钟内,我们指定@ComponentScan(package with second @Component annotated class)
将其称为 config2,在第三个类中,我们指定将其@ComponentScan(both packages)
称为 config3。
现在在主类中,我们有以下代码:
public static void main(String[] args) {
// point 1 in time
System.out.println("lalalalalala");
// point 2 in time
AnnotationConfigApplicationContext context1 =
new AnnotationConfigApplicationContext(config1.class);
// point 3 in time
AnnotationConfigApplicationContext context2 =
new AnnotationConfigApplicationContext(config2.class);
// point 4 in time
AnnotationConfigApplicationContext context3 =
new AnnotationConfigApplicationContext(config3.class);
}
我的理解:
在时间点 1,我们的应用程序正在运行 Spring Core。此时 Spring 创建了 Container 并且它没有对象。它是空的。 时间点1
那么我们创建AnnotationConfigApplicationContext
类型的对象。我们将 config1 类作为参数发送给该对象。然后该对象将读取@ComponentScan
注释并扫描 POJO 和元数据。扫描后,AnnotationConfigApplicationContext
对象将创建 bean(本例中为 1 个 bean,并使用这种类型的上下文进行预加载)并将它们放置在 Spring Container 中。所以在我们的应用程序的这一点上,我们第一次在我们的 Spring Container 中有一些东西。
时间点 2
类型的对象AnnotationConfigApplicationContext
只会引用我们放入容器中的 bean?!那么当我们调用getBean()
方法时,我们的 Context 会从 Container 中“带”出 bean 吗?
同样的事情发生在时间点 3 和时间点4 上......
所以,基本上我的问题是:对象是某种实现BeanFactory
,读取 POJO 和元数据,创建 BEANS 并将它们放入 Spring Container?它不包含bean,它只指向容器中的那些bean?而Container只包含那些bean,他除了持有bean之外没有任何功能,就像它只是放在内存中一样?而且我们的应用程序中只有一个 Container,我们可以有多个 BeanFactory 对象但只有一个 Container?