springboot容器啟動順序之@Configuration ContextRefreshedEvent事件初始化 ApplicationRunner


筆者最近遇到一個問題 我們根據自己業務需要  需要首次啟動springboot項目時 把數據庫數據同步至本地緩存(比如ehcache)但有一個要求 在緩存未載入成功  不允許有流量打入

一開始我們使用的是一個類實現ApplicationRunner  但發現  這個啟動任務是需要等bean全部完成初始化 springmvc等完成初始化后才開始執行,這個時候 如果剛好遇到同步緩存進行中,就會出現緩存穿透的情況 而我們的應用又是希望完成同步完成之后  從緩存中獲取數據  這個時候 筆者改成偵聽ContextRefreshedEvent初始化完成事件  其實這個方案也已經能解決,

只是筆者項目里面 已經有一個地方用到了這個 剛好尷尬的地方是 這個地方 是發布dubbo的執行方法  而我其實是希望在發布dubbo接口之前完成初始化工作 因為dubbo接口也很有可能消費者會調用  這個還是會造成緩存穿透  所以我單獨寫了一個@Configuration 

@Configuration

public class SyncFaceInfoToCacheListener {

 

private static Logger logger = LoggerFactory.getLogger(SyncFaceInfoToCacheListener.class);

 

@Autowired

@Qualifier("sqliteManagerImpl")

private SqlieteManager sqlieteManager;

 

@Autowired

private FaceCompareManager faceCompareManager;

 

 

@Value("${local.sqlite.sqlname}")

private String sqlName;

 

 

@Bean

public SyncFaceInfoToCacheListener onApplicationEvent() {

//TODO這里執行業務邏輯

 

return new SyncFaceInfoToCacheListener();

 

}

這樣其實優先級會高於基於bean同步完成后的事件監聽:ContextRefreshedEvent

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM