記一次詭異的空指針

接到一個問題,說服務啓動後偶爾會有空指針的問題。偶現。

背景

項目是 SpringBoot 項目,

按報錯,是 service 注入爲空,然後在執行時就空指針了。

@Service("xxxService")
public class xxxService {

    @Autowired
    AService aService;


    public void exec(){
        aService.run();//這裏拋了空指針
    }
}

問題表象

偶現的空指針,在服務啓動後,有時ok,有時空指針。

問題排查

首先想到的是啓動有異常了。Spring Bean 初始化失敗了。

登上服務器,啓動異常的情況下,看了下啓動日誌。沒有異常。

但是很明顯的看到另一個問題。

服務啓動時。 Spring Bean 執行了兩次實例化 。

問題一下子就明瞭了。

問題

查看了 main 方法。

public class SpringMain{
    public static void main(String[] args){
        //.....略過中間邏輯

        application.run();
        //......略過中間邏輯
        application.run();
    }
}

明顯程序 run 了兩次。bean 實例化了兩次。

那麼爲什麼 Spring 實例化第二次,就不再初始化 bean 了呢??第二次實例化的 bean 就是個 null 了呢?

原因

這就是 Spring 初始化的流程得了解 。

這裏 run 了兩次,但 run 的是同一個 Spring 容器,同一個 Spring 容器內會去加載 Bean。

但會判斷下 Bean 是否已經初始化了 。 如果已經初始化了,就不再初始化了。

解決

去掉一個 run()

總結

新手們還是要多解一些原理。寫代碼會寫,但定位問題也很重要,

這麼明顯的執行了兩次實例化竟然看不見。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章