Java 春天的依赖注入

Java 春天的依赖注入,java,spring,jakarta-ee,Java,Spring,Jakarta Ee,我试图理解依赖注入是如何工作的。我正在阅读Pro Spring 2.5,已经阅读了第3章。我想到的一些问题是: 当您在独立应用程序的主方法中创建bean工厂(在web应用程序中了解它也很有趣)然后读取bean配置文件时,会发生什么? 它是在此时创建具有依赖关系的bean并将其保存在寄存器中,还是仅仅将配置信息保存在寄存器中 我理解,如果您有MyApplication类或其他可以引导首选应用程序的类,您应该尽量减少依赖项查找。现在,如果带有寄存器的工厂仅在main方法中可用,那么Spring或PO

我试图理解依赖注入是如何工作的。我正在阅读Pro Spring 2.5,已经阅读了第3章。我想到的一些问题是:

当您在独立应用程序的主方法中创建bean工厂(在web应用程序中了解它也很有趣)然后读取bean配置文件时,会发生什么? 它是在此时创建具有依赖关系的bean并将其保存在寄存器中,还是仅仅将配置信息保存在寄存器中


我理解,如果您有MyApplication类或其他可以引导首选应用程序的类,您应该尽量减少依赖项查找。现在,如果带有寄存器的工厂仅在main方法中可用,那么Spring或POJO如何知道何时何地注入依赖项?寄存器不是只在main方法中可用吗?既然您不再调用“getBean(…)”,那么构造在哪里发生?它是如何将bean保持为单例的呢?

我想最好通过阅读这里发布的链接来回答这个问题: 尤其是马丁·福勒的文章

想象一下你的所有物体都生活在一个容器里。此容器中的对象的整个生命周期(创建、销毁、初始化)由spring或容器中的其他对象管理。那么,什么时候开始构建类呢?嗯,当您调用
getBean()
时,Spring将尝试为您获取这个类实例。它将具有某些依赖项(spring管理的属性),因此spring也将构建这些类的实例,这些类也将具有其他依赖项,以此类推,直到构建应用程序对象图的相关部分为止

当您关闭容器(BeanFactory或ApplicationContext时,spring会处理任何必要的关闭(即破坏数据库连接等)

单例bean(在应用程序的生命周期内只存在一个实例的bean)是预先实例化的,但这不是一个要求。整个对象图可以根据需要延迟构建

在web应用程序中,类似于
getBean()
调用的东西会将某个请求链接到您的控制器,但具体细节在不同的实现中有所不同。可以安全地假设,将每条路由绑定到控制器时,这种情况只会发生一次

它是否在此时创建具有依赖关系的bean,并将这些bean保存在寄存器中

是的,默认情况下,一旦您创建了
BeanFactory
ApplicationContext
(请参阅:)的实例,Spring就会创建所有bean并将它们连接起来。具有
lazy
作用域的bean除外,但如果它们是非懒惰bean的依赖项,则会创建它们

Spring还管理bean初始化的正确顺序

现在,Spring或POJO如何知道何时何地注入依赖项

基本上,所有的bean都存在于Spring容器中。如果您获取一个bean,它已经有了对其直接依赖项的引用。它们反过来又有对另一个的依赖项。底线是:所有bean通常都是在启动时创建和连接的,它们有点像单例

另见

您在7小时前问过同样的问题吗?那么您所说的关于他们如何以及何时获得依赖关系的问题是,我的应用程序可能依赖于类A,而类A又依赖于B和C等等?但是当您使用依赖项注入而不是依赖项查找时,我仍然不理解bean注册表u手动咨询bean工厂和注册表。每个类如何获得它们的依赖关系?@viper:如何解释这一点……一旦创建了应用程序上下文,所有bean都会被创建并连接起来。一切都会在启动时自动进行。Spring将首先创建
B
C
,然后创建
A
>然后将
B
C
注入到to中。最后,它将创建
MyApplication
并注入
C
。这一切都在启动时完成,并保存在内存中。当您为
MyApplication
实例询问
BeanFactory
时,它只返回已创建的bean,并注入依赖项。调用
getBean()
返回已经存在的wired bean。您晚上有5分钟的空闲时间来进行Java聊天吗?@Viper,很遗憾,没有。但请随时提出进一步的问题,因此,我/我们将尽最大努力帮助您在运行时实现这一点。整个应用程序(对象图)没有延迟加载在我的应用程序被查找后,是否立即在内存中?它是递归完成的,一次浏览整个应用程序?也许我开始理解了。如果在运行时完成,这与手动“新建”对象时发生的情况相反吗?感谢您清除了一些部分,但是因为您只调用“getBean()”从一开始,当其他类从未引用工厂时,Spring如何注入正确的依赖项等?Spring调用这些类的构造函数,它们不需要引用工厂。是的,谢谢。我现在已经理解了这个概念,我发现我一开始完全误解了它:)