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

Java Spring IoC-确保在@PostConstruct/afterpropertiesset之前创建所有bean,java,spring,Java,Spring,我有一个使用SpringIOC进行依赖注入的项目,我正试图通过一个中心位置来访问我的大多数bean,从而稍微简化我的模型 我在使用@PostConstruct机制时遇到问题,或者在实现初始化bean接口时遇到问题。虽然该特定bean中的所有依赖项可能都已解决,但注入bean中的依赖项可能尚未解决。例如,我有: public class A { public void doSomething() {}; } public class B { private A objectA;

我有一个使用SpringIOC进行依赖注入的项目,我正试图通过一个中心位置来访问我的大多数bean,从而稍微简化我的模型


我在使用
@PostConstruct
机制时遇到问题,或者在实现
初始化bean
接口时遇到问题。虽然该特定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();
    }
}
我的context.xml文件定义了这三个bean并注入了适当的属性,但是我得到了一个
NullPointerException
当类C的对象被实例化并且调用了
AfterPropertieSet
方法时,调试显示对
getObjectA()
的调用返回
null
。如果我将对象A直接注入到类C中,我不会得到任何错误

在调用我的
AfterPropertieSet
方法/任何带有
@PostConstruct
注释的方法之前,是否有一种机制可以确保所有bean都已完全实例化

谢谢

Joseph.

AfterPropertieSet()调用注入依赖项的方法还为时过早。实际上,init方法(如果在XML中有)是在AfterPropertieSet()之后调用的,然后调用BeanPostProcessor的postProcessAfterInitialization()。您有@Required注释,所以,当然,RequiredAnnotationBeanPostProcessor被执行

生命周期回调方法就是这样:它们通知您生命周期事件,其目的不是让您劫持Spring正在执行的任务。(虽然您可以像在C中直接注入对象A时那样执行此操作,但不建议这样做)

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

afterPropertieSet()调用注入依赖项的方法还为时过早。实际上,init方法(如果在XML中有)是在AfterPropertieSet()之后调用的,然后调用BeanPostProcessor的postProcessAfterInitialization()。您有@Required注释,所以,当然,RequiredAnnotationBeanPostProcessor被执行

生命周期回调方法就是这样:它们通知您生命周期事件,其目的不是让您劫持Spring正在执行的任务。(虽然您可以像在C中直接注入对象A时那样执行此操作,但不建议这样做)


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

实现ApplicationListener[ContextRefreshedEvent]并在onApplicationEvent()中执行您的工作。警告-ContextRefreshedEvent有时会发布多次,因此您可能希望在第一次获得它后设置一个标志以忽略其他事件。

实现ApplicationListener[ContextRefreshedEvent],并在onApplicationEvent()中执行工作。警告-ContextRefreshedEvent有时会发布多次,因此,您可能希望在第一次获取标记后设置一个标记以忽略其他事件。

使用@DependsOn确保在C之前实例化a。

使用@DependsOn确保在C之前实例化a。

ApplicationContextAware.setApplicationContext()在过程中很早就被调用,在所有的豆子都烤好之前。@ericacm评论得很好。我正期待着呢在AfterPropertieSet()之前调用setApplicationContext是完全正确的。所以问题是为什么AfterPropertieSet()太早,applicationContext的getBean()也可以。这引起了很多问题。事实上,Spring的设计师们早在7年前就对此展开了争论。请参阅。ApplicationContextAware.setApplicationContext()在过程中很早就被调用了,就在所有bean烘焙之前。@ericacm评论得很好。我正期待着呢在AfterPropertieSet()之前调用setApplicationContext是完全正确的。所以问题是为什么AfterPropertieSet()太早,applicationContext的getBean()也可以。这引起了很多问题。事实上,Spring的设计师们早在7年前就对此展开了争论。请参阅。ContextRefreshedEvent被剥离,添加回方括号中。ContextRefreshedEvent被剥离,添加回方括号中。“虽然该特定bean中的所有依赖项可能都已解决,但注入bean中的依赖项可能尚未解决。”是什么让您得出这样的结论?在您的例子中,C需要B,而B又需要A。因此,当创建C的实例时,您将拥有B的实例以及已创建的A。“虽然该特定bean中的所有依赖关系可能已解决,但注入bean中的依赖关系可能尚未解决。”您是如何得出这一结论的?在您的例子中,C需要B,而B又需要A。因此,当创建C实例时,您将拥有B实例以及已创建的A实例。