dependency injection如何工作?

我正在阅读Pro Spring 2.5书,我对dependency injection如何工作有疑问。

我理解BeanFactory并进行依赖查找。 现在我读到dependency injection,我有一些问题。 根据我的理解,您希望将查找限制到最小,例如查找对象以启动应用程序。 然后dependency injection将处理其余的事情。 但是我不明白这是有效的。

假设您有一个beanfactory,您将获得一个启动整个应用程序的MyApplication实例。 其余对象使用dependency injection来获取其协作者。 beanfactory维护它管理的bean列表,但这个工厂不仅仅在应用程序的main方法中可用吗? 如果beanfactory还管理其包含bean的范围,我不明白这是怎么做的。 豆瓣在某种程度上是全球性的吗?

bean工厂实例化所有对象。 它解析您的配置(xml或注释),实例化您的bean并设置它们的依赖项。 然后,所有这些bean都存储在应用程序上下文中。

您通常有一个应用程序的入口点 – 您可以在其中执行context.getBean(..) 。 现在bean已经注入了它的依赖项,因为它被bean工厂放在上下文中。

可能会清除事物的经验法则:在使用DI框架时,您从不使用new运算符(使用bean类)。 框架使实例,而不是你。

因此,有两种方法可以实现(截至Spring 3)。 在“传统”dependency injection中,bean工厂只能将依赖项注入它自己创建的bean中。 在这种情况下,bean工厂将在首次创建该bean时解析并注入bean的所有依赖项。

另一种方式要求您使用“完整”AspectJ进行加载或编译时编织。 在这种情况下,您使用spring-aspects.jar中的一个方面,该方面基本上指向所有new操作,允许您在任意创建的对象中获取依赖项注入。 这是通过使用@Configurable注释触发的。 你可以在这里阅读更多。

控制和dependency injection反转的重点是你(通常)除了启动应用程序之外不需要 beanfactory。 您的依赖项“自动显示”在对象中。 这基本上适用于在应用程序的整个生命周期内具有极少数(通常是一个)实例的对象。

例如,如果您的MyApplication依赖于MyModuleA的实例,那么您可以简单地使用@Autowired。 当你在启动时从beanfactory获取应用程序对象时,它已经带有一个MyModuleA预设实例。

关于范围:这来自Web上下文。 除了只有一个实例的对象之外,您可以将对象作为用户会话的范围。 在那里,你可以存储你需要的信息,以便为不同的用户分开,但想一想:购物车。

通常将bean工厂视为全局工厂。 我认为有可能有几个实例,但它们将被断开连接,并且不能注入仅为其他实例所知的对象。