奇妙なnullポインターを覚えている

サービスの開始後に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つのインスタンス化は、明らかに見えません。

おすすめ

転載: www.cnblogs.com/ElEGenT/p/12708742.html