Java Spring IoC-确保在@PostConstruct/afterpropertiesset之前创建所有bean
我有一个使用SpringIOC进行依赖注入的项目,我正试图通过一个中心位置来访问我的大多数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;
我在使用
@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实例。