page contents

ApplicationListener接口中的onApplicationEvent启动是会执行两次的原因是什么

Pack 发布于 2020-01-03 15:32
阅读 837
收藏 0

问题描述

ApplicationListener接口中的onApplicationEvent启动是会执行两次的原因是什么?


问题出现的环境背景及自己尝试过哪些方法

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)


@Component

public class InitBeanTest implements InitializingBean,ApplicationListener {

@Resource

private DemoService demoService;


public InitBeanTest() {     

       System.err.println("----> InitSequenceBean: constructor: "+demoService);     

    }  


@PostConstruct  

public void postConstruct() {  

    System.err.println("----> InitSequenceBean: postConstruct: "+demoService);  

}  


@Override  

public void afterPropertiesSet() throws Exception {  

    System.err.println("----> InitSequenceBean: afterPropertiesSet: "+demoService);  

}  


@Override  

public void onApplicationEvent(ContextRefreshedEvent arg0) {  

    System.err.println("----> InitSequenceBean: onApplicationEvent");  

}  

}


执行结果:


----> InitSequenceBean: constructor: null

----> InitSequenceBean: postConstruct: com.yiniu.kdp.service.impl.DemoServiceImpl@40fe544

----> InitSequenceBean: afterPropertiesSet: com.yiniu.kdp.service.impl.DemoServiceImpl@40fe544

----> InitSequenceBean: onApplicationEvent

----> InitSequenceBean: onApplicationEvent


你期待的结果是什么?实际看到的错误信息又是什么?

95
Pack
Pack

你是web项目吧,web项目的话系统会存在两个容器,一个是root application contex,一个是web容器


可以在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理


@Override

   public void onApplicationEvent(ContextRefreshedEvent event) {

       if(event.getApplicationContext().getParent() == null){//root application context 没有parent

            //需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。

       }

   }

请先 登录 后评论