在Spring3中注入applicationContext的最佳实践。

问题描述 投票:9回答:5

就像上面的标题一样,我对直接通过@Autowired注解注入ApplicationContext还是在一个单例的spring bean中实现ApplicationContextAware接口的利弊感到困惑。

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

spring dependency-injection spring-3 applicationcontext
5个回答
11
投票

其实,这两种方式都不好。它们都将你的应用与Spring框架捆绑在一起,从而颠覆了整个反转控制的概念。在一个理想的世界里,你的应用程序根本不应该意识到被ApplicationContext管理。

一旦你选择了违反这个原则,你怎么做并不重要。ApplicationContextAware 是一直存在的传统版本 至少从2.0版本开始. @Autowired 是一个较新的机制,但他们的工作方式几乎是一样的。我可能会选择 ApplicationContextAware,因为它在语义上明确了它的内容。


2
投票

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

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


2
投票

如果你需要在一个单体中获得一个原型,那么你可以使用方法注入。基本上,你创建一个抽象方法,返回你需要的对象,每次调用该方法时,spring都会返回原型。你在你的spring配置中定义 "lookup-method"。这里有一些链接。http:/docs.spring.iospringdocs1.2.9referencebeans.html#beans-factory-method-injection。http:/java.dzone.comarticlesmethod-injection-spring。


0
投票

既然你是 不扩展任何spring类,你的应用程序总是与框架分离。. 大多数情况下,你将不希望注入的。ApplicationContext 中定义的豆子,但需要注入在 ApplicationContext.

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

所以要么,

  1. 注释你的豆子和 scan 他们 application context,然后用 @Autowire 来连接它们。

  2. 使用 application context 来连接你的Bean权宜之计(旧的xml风格配置)。你可以使用 @Autowire 也用这种方法。

当你想控制bean的生命周期时,你可以读取API,并对其进行定制,但大多数时候,这些一般的设置就可以完成工作了。

下面是一些例子。

  1. 使用@Autowired注解的Spring自动布线Bean。
  2. Spring自动布线Bean XML样式
  3. Spring IoC容器API文档

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,在这种情况下,不清楚哪些豆子会被查到,需要被支取。

© www.soinside.com 2019 - 2024. All rights reserved.