ContextRefreshedEvent 触发多次问题
ContextRefreshedEvent 在哪被触发
在 AbstractApplicationContext 的 refresh() 方法中的 finishRefresh() 步骤中被触发。
也就是说当 context refresh 一次就会触发一次 ContextRefreshedEvent 事件
什么情况下 context 会 refresh() 多次
-
手动执行多次 refresh 方法
-
创建了多个 context,每个 context refresh 完成后都会触发
- Feign 在创建一个 FeignClient 就会生成一个 context(主要环境隔离操作)
怎么样才能执行一次
- 如果你使用的是 springboot,可以监听 ApplicationReadyEvent 事件,是由 SpringAppilication 触发(一般情况下不会存在多个 SpringApplication同时运行)
- 将 Listener 只能给一个 固定的 ApplicationContext 加载到
- 可以在 onApplicationEvent 事件接收处理方法中进行幂等性的判断
- 可以通过 event 的属性判断,比如:类型,displayName