正如上面的标题,我对通过直接@Autowired 注释注入applicationContext 或在单例spring bean 中实现ApplicationContextAware 接口之间的利弊感到困惑。
在哪种情况下您更喜欢哪一种,为什么?谢谢。
正如上面的标题,我对通过直接@Autowired 注释注入applicationContext 或在单例spring bean 中实现ApplicationContextAware 接口之间的利弊感到困惑。
在哪种情况下您更喜欢哪一种,为什么?谢谢。
其实,两者都不好。它们都将您的应用程序绑定到 Spring 框架,从而颠倒了整个控制反转的概念。在理想情况下,您的应用程序根本不应该意识到由 ApplicationContext 管理。
一旦你选择违反这个原则,你怎么做就无关紧要了。ApplicationContextAware
是至少从 2.0 版开始就存在的旧版本。@Autowired
是一种较新的机制,但它们的工作方式几乎相同。我可能会选择ApplicationContextAware
,因为它在语义上清楚地说明了它的含义。
正如@Sean Patrick Floyd 所说,对 ApplicationContext 的需求通常是由于糟糕的设计。但有时你别无选择。在这些情况下,我更喜欢使用@Autowired,因为这是我注入所有其他属性的方式。那么,如果我使用@Autowired 来注入 MyRepository,为什么我不能将它用于 ApplicationContext 或任何其他 Spring bean?
我只将 Spring 接口用于那些我不能用注释做的事情,例如 BeanNameAware。
如果您需要在单例中获取原型,则可以使用方法注入。基本上,您创建一个返回所需对象的抽象方法,并且每次调用该方法时,spring 都会返回原型。您在 spring 配置中定义“查找方法”。这里有一些链接: http ://docs.spring.io/spring/docs/1.2.9/reference/beans.html#beans-factory-method-injection http://java.dzone.com/articles/method-注射弹簧
由于您没有扩展任何 spring 类,因此您的应用程序始终与框架分离。大多数情况下,您不想注入ApplicationContext
原样,但需要注入定义在ApplicationContext
.
最好的情况是始终坚持最低限度,除非您有任何特定要求,这对于 spring 非常简单。
所以要么,
在 中注释你的 bean 和scan
它们application context
,然后用@Autowire
它们来连接它们。
用于application context
连接您的 bean 权宜之计(旧的 xml 样式配置)。您也可以使用 @Autowire
这种方法。
当您想控制 bean 生命周期时,您可以读取 API 并对其进行自定义,但大多数时候这些常规设置将完成这项工作。
这里有些例子。
完全没有必要使用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
是 a )来替换这个依赖项(例如在测试中) 。@FunctionalInterface
虽然可以对 进行存根ApplicationContext
,但在这种情况下尚不清楚哪些 bean 将被查找并需要存根。