我有一个使用Spring IoC进行依赖注入的项目,我试图通过一个访问我的大多数bean的中心位置来略微简化我的模型.
我遇到了使用该@PostConstruct机制的问题,或者在实现InitializingBean接口时遇到了问题.虽然可能已经解决了该特定bean中的所有依赖项,但注入Bean中的依赖项可能不是.例如,我有:
public class A {
public void doSomething() {};
}
public class B {
private A objectA;
@Required
public void setObjectA(A objectA) {
this.objectA = objectA;
}
public A getObjectA() {
return objectA;
}
}
public class C implements InitializingBean {
private B objectB;
@Required
public void setObjectB(B objectB) {
this.objectB = objectB;
}
public void afterPropertiesSet() throws Exception {
objectB.getObjectA().doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
我的context.xml文件定义了这三个bean并注入了相应的属性,但是NullPointerException当得到类C的对象被实例化并且afterPropertiesSet调用该方法时,我得到一个调试向我显示getObjectA()返回的调用null.如果我将对象A直接注入类CI则不会出错.
是否有一种机制可以用来确保所有bean在我的afterPropertiesSet方法/任何带注释的方法@PostConstruct被调用之前已经完全实例化?
谢谢,
约瑟夫.
afterPropertiesSet()在注入依赖项上调用方法还为时尚早.实际上,在调用afterPropertiesSet()然后调用BeanPostProcessors的postProcessAfterInitialization()之后调用init方法(如果你有XML格式).你有@Required注释,因此,当然,执行RequiredAnnotationBeanPostProcessor.
生命周期回调方法就是它们:它们告诉您生命周期事件,它们的目的不是让您劫持Spring正在执行的任务.(虽然你可以像在C-中直接注射物体A时那样做,但不建议这样做).
如果你想在C类中使用对象A(或任何其他spring bean),那么我建议使用ApplicationContextAware(或BeanFactoryAware,视情况而定)并使用getBean()方法完全烘焙并准备好服务豆!
实现ApplicationListener [ContextRefreshedEvent]并在onApplicationEvent()中完成您的工作.注意事项 - ContextRefreshedEvent有时会多次发布,因此您可能希望在第一次获取标志后忽略其他事件.