Spring ApplicationListener在webapp上被触发两次

Ped*_*cía 7 spring spring-mvc

我有一个应用程序监听器,它应该每个webapp启动只执行一次,因为它加载基本的用户信息数据.

public class DefaultUsersDataLoader implements ApplicationListener<ContextRefreshedEvent> {
  @Override
  @Transactional
  public void onApplicationEvent(ContextRefreshedEvent e) {...}
}
Run Code Online (Sandbox Code Playgroud)

不知何故,它会被执行两次:在应用程序启动时以及第一个请求到达服务器时.为什么会发生这种情况,我该如何预防呢?

M. *_*num 11

通常在Spring MVC应用程序中,您同时拥有ContextLoaderListenerDispatcherServlet.两个组件都创建了自己的组件ApplicationContext,而这两个组件都会触发ContextRefreshedEvent.

DispatcherServlet用途ApplicationContext,通过创建ContextLoaderListener作为其父.从子上下文触发的事件将传播到父上下文.

现在,如果您ApplicationListener<ContextRefreshedEvent>在根上下文(由其加载的那个ContextLoaderListener)中定义了它,它将接收两次事件.

  • 谢谢.我用`e.getApplicationContext().getParent()!= null`来排除它,但它似乎有点hacky.我想知道周围是否有更好的练习? (6认同)