Java Spring递归加载应用程序上下文
我想在加载应用程序上下文后调用一个方法。我使用了Java Spring递归加载应用程序上下文,java,spring,spring-ioc,Java,Spring,Spring Ioc,我想在加载应用程序上下文后调用一个方法。我使用了ApplicationListener接口,并在ApplicationEvent上实现了 applicationContext.xml <beans> <bean id="loaderContext" class="com.util.Loader" /> <bean id="testServiceHandler" class="com.bofa.crme.deals.rules.handler.Tes
ApplicationListener
接口,并在ApplicationEvent上实现了
applicationContext.xml
<beans>
<bean id="loaderContext" class="com.util.Loader" />
<bean id="testServiceHandler" class="com.bofa.crme.deals.rules.handler.TestServiceHandlerImpl">
</beans>
Loader.java
public class Loader implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TestHandlerServiceImpl test = (TestServiceHandlerImpl)context.getBean("testServiceHandler");
}
}
applicationContext.xml
Loader.java
公共类加载器实现ApplicationListener{
ApplicationEvent上的公共无效(ApplicationEvent事件){
ApplicationContext context=new ClassPathXmlApplicationContext(“ApplicationContext.xml”);
TestHandlerServiceImpl test=(TestServiceHandlerImpl)context.getBean(“testServiceHandler”);
}
}
但是上面的代码是递归的。是否可以从ApplicationEvent函数中的应用程序上下文中获取bean?实现接口,而不是在侦听器上创建新上下文,您的上下文将被注入。如果您使用的是Spring 3或更高版本:
从Spring3.0开始,ApplicationListener可以一般地声明
它感兴趣的事件类型。当向Spring注册时
ApplicationContext,事件将被相应地过滤,其中
仅为匹配事件对象调用侦听器
看起来像下面这样。还要注意,这个解决方案将确保它只在这个事件上执行(即启动/加载):在我看来,即使您将上下文注入到原始类中,它也会针对任何事件执行
public class Loader implements ApplicationListener<ContextStartedEvent> {
public void onApplicationEvent(ContextStartedEvent event) {
ApplicationContext context = event.getApplicationContext();
}
}
公共类加载器实现ApplicationListener{
ApplicationEvent(ContextStartedEvent事件)上的公共无效{
ApplicationContext context=event.getApplicationContext();
}
}
请参见此处的示例:
您正在重新加载应用程序上下文;不知道你会期待什么。让它了解上下文或其他内容。你应该看看: