サービスの開始後にnullポインターが発生することがあるという質問を受け取りました。時々。
背景
プロジェクトはSpringBootプロジェクトであり、
エラーによると、サービスインジェクションはnullで、実行中はポインタがnullになります。
@Service("xxxService")
public class xxxService {
@Autowired
AService aService;
public void exec(){
aService.run();//这里抛了空指针
}
}
問題の表現
場合によっては、サービスの開始後にnullポインターで問題が発生することも、nullポインターが発生することもあります。
トラブルシューティング
最初に頭に浮かぶのは、起動が異常であることです。Spring Beanの初期化に失敗しました。
サーバーにログオンし、起動が異常な場合は起動ログを確認します。例外はありません。
しかし、別の問題が見られることは明らかです。
サービスが開始したとき。Spring Beanは2回インスタンス化されました。
問題はすぐに明らかになりました。
問題
メインメソッドを表示しました。
public class SpringMain{
public static void main(String[] args){
//.....略过中间逻辑
application.run();
//......略过中间逻辑
application.run();
}
}
明らかに、プログラムは2回実行されています。Beanは2回インスタンス化されます。
では、なぜSpringはBeanを2回目にインスタンス化しないのでしょうか。?2番目のインスタンス化されたBeanはnullですか?
理由
これはSpringの初期化のプロセスです。
ここには2つの実行がありますが、同じSpringコンテナーが実行され、Beanは同じSpringコンテナーにロードされます。
ただし、Beanが初期化されているかどうかを判断します。初期化されている場合は初期化されません。
解決する
ランを削除する()
まとめ
初心者はまだより多くの原則を理解する必要があります。コードを書くことは書くでしょうが、ポジショニングの問題も非常に重要です、
実行された2つのインスタンス化は、明らかに見えません。。。