我刚刚阅读了关于构造函数和setter依赖注入的Spring文档。 然而,DI的整个概念仍然让我很困惑。特别是,这个过程似乎仍然非常有限或受我限制。
我理解第三方(Spring)的想法,它完全分配和连接对象的依赖关系。但是如果我们只通过构造函数(init time)和setter(init然后执行一些属性设置)来提供依赖关系,那么我们如何在以后重新配置或重新注入新的bean呢?
我的意思是例如bean A
引用了bean B
。通过构造函数或setter注入,我们可以像我们从文档中知道的那样做。但是,如果稍后在应用程序中我们需要bean A
来获取对其他对象/ bean C
的引用呢?
我们是否需要从新的Spring XML配置文件或其他方法加载新的应用程序上下文?此操作可能会多次执行,因此应该很容易配置。令我惊讶的是,大多数教程或Spring DI的解释都没有提到这样的常见任务。也许我需要其他关键字(目前我正在使用Spring重新注入)。
答案 0 :(得分:0)
您可以在A
中注入ApplicationContextprivate 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这样的上下文驱动框架在注入服务时会使用代理,这些服务的生命周期与注入服务的生命周期不同。然后,当代理下面的服务发生更改时,代理只会查找新实例并将其用于后续调用。还有其他原因,像这样的框架使用代理,例如为了避免具有昂贵的初始化成本的服务。