我正在阅读Pro Spring 2.5的书,我对依赖注入如何工作有疑问。
我理解BeanFactory并进行依赖查找。现在我读到依赖注入,我有一些问题。根据我的理解,您希望将查找限制到最小,例如查找对象以启动应用程序。然后依赖注入将处理其余的事情。但是我不明白这是有效的。
假设您有一个beanfactory,您将获得一个启动整个应用程序的MyApplication实例。其余对象使用依赖注入来获取其协作者。 beanfactory维护它管理的bean列表,但这个工厂不仅仅在应用程序的main方法中可用吗?如果beanfactory还管理其包含bean的范围,我不明白这是怎么做的。豆瓣在某种程度上是全球性的吗?
答案 0 :(得分:2)
因此,有两种方法可以实现(截至Spring 3)。在“传统”依赖注入中,bean工厂只能将依赖项注入它自己创建的bean中。在这种情况下,bean工厂将在首次创建该bean时解析并注入bean的所有依赖项。
另一种方式要求您使用“完整”AspectJ进行加载或编译时编织。在这种情况下,您使用spring-aspects.jar中的一个方面,该方面基本上切入所有new
操作,允许您在任意创建的对象中获取依赖项注入。这是使用@Configurable
注释触发的。您可以阅读更多here。
答案 1 :(得分:2)
bean工厂实例化所有对象。它解析您的配置(xml或注释),实例化您的bean并设置它们的依赖项。然后,所有这些bean都存储在应用程序上下文中。
您通常有一个入口点 - 您可以context.getBean(..)
。现在bean已经注入了它的依赖项,因为它被bean工厂放在上下文中。
可能会清除事物的经验法则:在使用DI框架时,您从不使用new
运算符(使用bean类)。框架是实例,而不是你。
答案 2 :(得分:0)
控制和依赖注入反转的重点在于你(通常)不需要 beanfactory,除非启动你的应用程序。您的依赖项“自动显示”在对象中。这基本上适用于在应用程序的整个生命周期内具有极少数(通常是一个)实例的对象。
E.g。如果您的MyApplication依赖于MyModuleA的实例,您可以简单地使用@Autowired。当你在开始时从beanfactory获取应用程序对象时,它已经带有一个MyModuleA预设实例。
关于范围:这来自网络环境。除了只有一个实例的对象之外,您可以将对象作为用户会话的范围。在那里,您可以存储您需要的信息,以便为不同的用户保留多个请求,请考虑:购物车。
通常将bean工厂视为全局工厂。我认为有可能有几个实例,但是它们将被断开连接,并且不能注入仅为其他实例所知的对象。