10

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

在哪种情况下您更喜欢哪一种,为什么?谢谢。

4

5 回答 5

12

其实,两者都不好。它们都将您的应用程序绑定到 Spring 框架,从而颠倒了整个控制反转的概念。在理想情况下,您的应用程序根本不应该意识到由 ApplicationContext 管理。

一旦你选择违反这个原则,你怎么做就无关紧要了。ApplicationContextAware至少从 2.0 版开始就存在的旧版本。@Autowired是一种较新的机制,但它们的工作方式几乎相同。我可能会选择ApplicationContextAware,因为它在语义上清楚地说明了它的含义。

于 2012-03-12T07:22:21.553 回答
2

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

我只将 Spring 接口用于那些我不能用注释做的事情,例如 BeanNameAware。

于 2012-03-12T12:06:18.230 回答
2

如果您需要在单例中获取原型,则可以使用方法注入。基本上,您创建一个返回所需对象的抽象方法,并且每次调用该方法时,spring 都会返回原型。您在 spring 配置中定义“查找方法”。这里有一些链接: http ://docs.spring.io/spring/docs/1.2.9/reference/beans.html#beans-factory-method-injection http://java.dzone.com/articles/method-注射弹簧

于 2013-09-10T19:12:48.530 回答
0

由于您没有扩展任何 spring 类,因此您的应用程序始终与框架分离。大多数情况下,您不想注入ApplicationContext原样,但需要注入定义在ApplicationContext.

最好的情况是始终坚持最低限度,除非您有任何特定要求,这对于 spring 非常简单。

所以要么,

  1. 在 中注释你的 bean 和scan它们application context,然后用@Autowire它们来连接它们。

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

当您想控制 bean 生命周期时,您可以读取 API 并对其进行自定义,但大多数时候这些常规设置将完成这项工作。

这里有些例子。

  1. 带有 @Autowired 注释的 Spring 自动装配 Bean
  2. Spring 自动装配 Beans XML 样式
  3. Spring IoC 容器 API 文档
于 2012-03-12T08:16:53.820 回答
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是 a )来替换这个依赖项(例如在测试中) 。@FunctionalInterface

虽然可以对 进行存根ApplicationContext,但在这种情况下尚不清楚哪些 bean 将被查找并需要存根。

于 2020-06-11T09:48:52.003 回答