在Spring 3中注入applicationContext的最佳实践

时间:2012-03-11 19:03:11

标签: spring dependency-injection spring-3 applicationcontext

正如上面的标题所示,我对通过直接@Autowired注释注入applicationContext或在单例spring bean中实现ApplicationContextAware接口之间的优缺点感到困惑。

您更喜欢哪一种?为什么?感谢。

5 个答案:

答案 0 :(得分:10)

实际上,两者都很糟糕。它们都将您的应用程序与Spring框架联系起来,从而颠覆了整个控制反转概念。在理想的世界中,您的应用程序根本不应该知道由ApplicationContext管理。

一旦你选择违反这个原则,你如何做到并不重要。 ApplicationContextAwareat least since Version 2.0周围的旧版本。 @Autowired是一种较新的机制,但它们的工作方式几乎相同。我可能会选择ApplicationContextAware,因为它在语义上明确了它的含义。

答案 1 :(得分:2)

正如@Sean Patrick Floyd所说,ApplicationContext的需求通常是由于糟糕的设计。但有时你别无选择。在那些情况下,我更喜欢使用@Autowired,因为这是我注入所有其他属性的方式。那么,如果我使用@Autowired注入MyRepository,为什么我不能将它用于ApplicationContext或任何其他Spring bean?

我只使用Spring接口来处理那些我无法用注释做的事情,例如BeanNameAware。

答案 2 :(得分:2)

如果你需要在单例中获得原型,那么你可以使用方法注入。基本上,您创建一个返回所需对象的抽象方法,每次调用该方法时spring将返回原型。你定义了"查找方法"在你的春天配置。以下是一些链接: http://docs.spring.io/spring/docs/1.2.9/reference/beans.html#beans-factory-method-injection http://java.dzone.com/articles/method-injection-spring

答案 3 :(得分:0)

由于您没有扩展任何Spring类,因此您的应用程序始终与框架分开。大多数情况下你不想注入ApplicationContext,但需要注入ApplicationContext中定义的bean。

最好的情况是始终坚持最低限度,除非你有任何特殊要求,这对于春天来说非常简单。

所以,

  1. scan中为您的bean和application context添加注释,然后使用@Autowire对其进行连线。

  2. 使用application context连接bean的权宜之计(旧的xml样式配置)。您也可以使用@Autowire这种方法。

  3. 当您想要控制bean生命周期时,您可以阅读API并对其进行自定义,但大多数情况下这些常规设置都可以完成这项任务。

    以下是一些例子。

    1. Spring Auto-Wiring Beans with @Autowired annotation
    2. Spring Auto-Wiring Beans XML Style
    3. Spring IoC container API Docs

答案 4 :(得分:0)

根本不需要使用ApplicationContext

ObjectFactory

如果需要在单例bean中使用原型作用域的bean,请插入org.springframework.beans.factory.ObjectFactory。 例如,使用构造函数注入:

@Service
class MyClass {
    private ObjectFactory<MyDependency> myDependencyFactory;

    public MyClass(ObjectFactory<MyDependency> prototypeFactory) {
        myDependencyFactory = prototypeFactory;
    }

}

为什么

现在,使用ApplicationContext有什么好处? 您可以通过简单地传递一个lambda(因为ObjectFactory@FunctionalInterface)来替代此依赖关系(例如在测试中),以返回其存根版本。

虽然可以对ApplicationContext进行存根,但是在那种情况下,尚不清楚将要查找哪些豆并需要对它们进行存根。