前言
由於之前的項目時SpringBoot的一體項目,後續想對項目進行微服務的重構,然而在重構的時候發現SpringCloud下的ContextRefreshedEvent事件觸發的順序和原本項目觸發的順序不一樣。
踩坑
首先上代碼: 原本的邏輯是在事件觸發的時候爲了避免重複觸發所以加了一個判斷條件,只有在第一次context==null的情況下才會執行對應的邏輯代碼。(實際上不加判斷條件貌似也沒有重複觸發,但是只是爲了更加保險所以加了一個判斷)。
@Component
public class NettyBooter implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//判斷容器是否爲空
if (event.getApplicationContext().getParent() == null) {
try {
WSServer.getInstance().start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
這裏在SpringBoot項目下第一次進入debug得到的context的確是爲null
然後再將原有的代碼移至SpringCloud項目中第一次觸發時居然是在context已經構建的情況下,這裏就導致之前的代碼沒有被執行。
感覺很奇怪,ContextRefreshedEvent事件是在context創建或context刷新時被觸發,爲什麼在SpringCloud項目中第一次被觸發時得到的是已經被創建好的AnnotationConfigApplicationContext。期望大佬可以講解一下。