正如上面的标题所示,我对通过直接@Autowired注释注入applicationContext或在单例spring bean中实现ApplicationContextAware接口之间的优缺点感到困惑。
您更喜欢哪一种?为什么?感谢。
答案 0 :(得分:10)
实际上,两者都很糟糕。它们都将您的应用程序与Spring框架联系起来,从而颠覆了整个控制反转概念。在理想的世界中,您的应用程序根本不应该知道由ApplicationContext管理。
一旦你选择违反这个原则,你如何做到并不重要。 ApplicationContextAware
是at 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。
最好的情况是始终坚持最低限度,除非你有任何特殊要求,这对于春天来说非常简单。
所以,
在scan
中为您的bean和application context
添加注释,然后使用@Autowire
对其进行连线。
使用application context
连接bean的权宜之计(旧的xml样式配置)。您也可以使用@Autowire
这种方法。
当您想要控制bean生命周期时,您可以阅读API并对其进行自定义,但大多数情况下这些常规设置都可以完成这项任务。
以下是一些例子。
答案 4 :(得分:0)
根本不需要使用ApplicationContext
。
如果需要在单例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
进行存根,但是在那种情况下,尚不清楚将要查找哪些豆并需要对它们进行存根。