[java] [spring] applicationContext.getBeansOfType(Class) 獲取不到實例對象的問題


    最近突然發現通過 applicationContext.getBeansOfType(Class)  有時會獲取不到指定類型的實例對象,代碼如下:

  通過allHander獲取指定名稱的ModuleHandler時獲取不到,但是對象其實是存在的。造成這個問題的原因其實是 applicationContext.getBeansOfType(Class)  是從已經被spring實例化的對象中尋找,如果該對象還未實例化,則獲取不到。看源碼:

   重點就是紅線部分的603行,只有當該類型的對象被實例化了才會返回。

也就是通過@PostConstruct 注解在HandlerMsgData構造函數執行完成后才執行的initAllHandler() , 此時有些對象還未被spring實例化,所以該方法獲取到結果並不完整。如果是想通過調整bean是實例化對象初始化順序來解決該問題,則成本比較大(大型工程中依賴關系很復雜)。所以最好的解決方式就是在獲取時檢查一次allHandler里是否存在指定數據,如果不存在則再次執行initAllHandler () , 這就相當於同步了一下緩存的數據。

 


免責聲明!

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



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