2012-03-16 110 views
1

我正在阅读Pro Spring 2.5的书,我有一个关于依赖注入如何工作的问题。依赖注入是如何工作的?

我了解BeanFactory并执行依赖关系查找。现在我读了关于依赖注入的内容,并且有一些问题。根据我的理解,您希望将查找限制在最低限度,例如查找引导应用程序的引导对象。然后,依赖注入将负责其余部分。但我不明白这个作品。

假设你有一个beanfactory,你会得到一个启动整个应用程序的MyApplication实例。剩下的对象使用依赖注入来获得他们的合作者。 beanfactory维护它管理的bean的列表,但不是该工厂仅在应用程序的主要方法中可用?如果beanfactory也管理它们包含bean的范围,我不明白这是如何完成的。 beanfactory在某种程度上是全球性的吗?

回答

2

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

您通常有一个入口点到您的应用程序 - 那里你context.getBean(..)。现在bean已经注入了它的依赖关系,因为它被bean工厂放到了上下文中。

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

+0

因此,“启动”应用程序的bean现在有一个注册表,它可以获取注入其依赖关系并准备好使用的bean? – LuckyLuke 2012-03-16 12:47:03

+0

是的。在Web上下文中,例如上下文(注册表)由侦听器启动,该侦听器由Spring提供并且您没有看到。 – Bozho 2012-03-16 12:58:12

2

所以,有两种方法可以发生(截至春季3)。在“传统”依赖注入中,bean工厂只能将依赖关系注入到自己创建的bean中。在这种情况下,当第一次创建bean时,bean工厂将解析并注入bean的所有依赖关系。

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

0

控制和依赖注入反转的关键在于您(通常)不需要 beanfactory,除非让您的应用程序启动。你的依赖“自动出现”在你的对象中。这基本上适用于在应用程序的整个生命周期中很少(通常是一个)实例的对象。

E.g.如果你的MyApplication依赖于MyModuleA的一个实例,你可以简单地使用@Autowired。当你在开始时从beanfactory获取应用程序对象时,它已经带有一个MyModuleA预置的实例。

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

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