我有一个标准的'context-holder'bean(比方说MyContext)在我的spring配置文件中实现了ApplicationContextAware
,而用init-method定义了另一个bean。
在init-method中,我调用MyContext.getApplicationContext().get("something")
,但由于尚未设置应用程序上下文,因此我得到NullPointerException
。 bean是一个集成测试。
我想问题是我使用init-method在bean之后定义了MyContext
bean。是对的吗?我认为Spring应该足够聪明,以便首先设置上下文。
对于这样的情况有没有解决方案?我的意思是,当你用init-method调用应用程序上下文本身后,在任何其他bean之后定义了ApplicationContextAware
bean?
顺便说一下Spring的流程是什么?我会接受一个答案,比如'Spring首先加载所有配置,然后创建所有bean实例,满足所有依赖项,调用所有init-methods,最后将应用程序上下文设置为ApplicationContextAware
bean - 所以你不能使用init-methods中的应用程序上下文。
答案 0 :(得分:0)
你应该使用@PostConstruct。带有此注释的方法将在收缩bean之后立即调用,但在任何地方使用之前都会被调用。
@PostConstruct
public void afterInitMethod() throws Exception {
//do you things there
}
答案 1 :(得分:0)
是的,Spring提供了一种方法来告诉容器bean依赖于另一个bean,因此应该在它之后进行实例化。指定依赖关系后,列出bean
文件中spring.xml
定义的顺序无关紧要。
<bean id="dependentBean" class="com.my.app.DependentBean" depends-on="appContext" />
<bean id="appContext" class="com.my.app.MyContext" />