春天再注射概念

时间:2014-02-27 05:36:39

标签: java spring dependency-injection

我刚刚阅读了关于构造函数和setter依赖注入的Spring文档。 然而,DI的整个概念仍然让我很困惑。特别是,这个过程似乎仍然非常有限或受我限制。

我理解第三方(Spring)的想法,它完全分配和连接对象的依赖关系。但是如果我们只通过构造函数(init time)和setter(init然后执行一些属性设置)来提供依赖关系,那么我们如何在以后重新配置或重新注入新的bean呢?

我的意思是例如bean A引用了bean B。通过构造函数或setter注入,我们可以像我们从文档中知道的那样做。但是,如果稍后在应用程序中我们需要bean A来获取对其他对象/ bean C的引用呢?

我们是否需要从新的Spring XML配置文件或其他方法加载新的应用程序上下文?此操作可能会多次执行,因此应该很容易配置。令我惊讶的是,大多数教程或Spring DI的解释都没有提到这样的常见任务。也许我需要其他关键字(目前我正在使用Spring重新注入)。

3 个答案:

答案 0 :(得分:0)

您可以在A

中注入ApplicationContext
private ApplicationContext context;

public void setApplicationContext(ApplicationContect context) {
    this.context = context;
}

然后您可以随时访问任何bean

...
    C c =context.getBean(C.class);
... 

答案 1 :(得分:0)

在应用程序中需要ApplicationContext的任何地方,使用ApplicationContextAware接口实现该类。

在这里说

 public class CalenderService implements ApplicationContextAware{

    private ApplicationContext context;//declare this so you can use it

 } 

因为它是界面,你需要覆盖它的方法

public void setApplicationContext(ApplicationContext context){
   this.context=context; // here ApplicationContext gets injected.
}

并在任何地方使用此背景。

答案 2 :(得分:0)

像Guice,HK2或CDI这样的上下文驱动框架在注入服务时会使用代理,这些服务的生命周期与注入服务的生命周期不同。然后,当代理下面的服务发生更改时,代理只会查找新实例并将其用于后续调用。还有其他原因,像这样的框架使用代理,例如为了避免具有昂贵的初始化成本的服务。