Spring IoC - 确保在@ PostConstruct/afterProperiesSet之前创建所有bean

Jos*_*son 1 java spring

我有一个使用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被调用之前已经完全实例化?

谢谢,

约瑟夫.

Rit*_*esh 5

afterPropertiesSet()在注入依赖项上调用方法还为时尚早.实际上,在调用afterPropertiesSet()然后调用BeanPostProcessors的postProcessAfterInitialization()之后调用init方法(如果你有XML格式).你有@Required注释,因此,当然,执行RequiredAnnotationBeanPostProcessor.

生命周期回调方法就是它们:它们告诉您生命周期事件,它们的目的不是让您劫持Spring正在执行的任务.(虽然你可以像在C-中直接注射物体A时那样做,但不建议这样做).

如果你想在C类中使用对象A(或任何其他spring bean),那么我建议使用ApplicationContextAware(或BeanFactoryAware,视情况而定)并使用getBean()方法完全烘焙并准备好服务豆!


sou*_*ica 5

实现ApplicationListener [ContextRefreshedEvent]并在onApplicationEvent()中完成您的工作.注意事项 - ContextRefreshedEvent有时会多次发布,因此您可能希望在第一次获取标志后忽略其他事件.