3

我想在加载应用程序上下文后调用一个方法。我使用ApplicationListener了接口并实现了onApplicationEvent.

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"); 
   }
}

但是上面的代码是递归的。是否可以从函数内部的应用程序上下文中获取 bean onApplicationEvent

4

2 回答 2

1

无需在侦听器上创建新上下文,而是实现接口ApplicationContextAware,您的上下文将被注入。

于 2014-12-19T15:24:54.510 回答
1

如果您使用的是 Spring 3 或更高版本:

从 Spring 3.0 开始,ApplicationListener 可以一般性地声明它感兴趣的事件类型。当向 Spring ApplicationContext 注册时,事件将被相应地过滤,只有匹配事件对象才会调用侦听器。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/ApplicationListener.html#onApplicationEvent-E-

如下所示。另请注意,此解决方案将确保它仅在此事件上执行(即启动/加载):在我看来,即使您将上下文注入原始类,它也会为任何事件执行。

public class Loader implements ApplicationListener<ContextStartedEvent> {

   public void onApplicationEvent(ContextStartedEvent event) {
         ApplicationContext context = event.getApplicationContext(); 
   }
}

请参阅此处的示例:

http://www.tutorialspoint.com/spring/event_handling_in_spring.htm

于 2014-12-19T15:28:28.580 回答