2

初期コンテキストの読み込み中に Bean をインスタンス化する際に、奇妙なスプリング動作を発見しました。大規模な ML モデルをロードする Bean がありました。メモリが不足しているため、Bean は Out java OutOfMemoryErrorjava heap space 例外をスローしてインスタンス化に失敗しました。ただし、これによってアプリケーションのインスタンス化が停止されるわけではなく、アプリケーションのロードが続行されます。

なぜこれが起こるのですか?これは期待されていますか?

スプリングをチェックしAbstractAutowireCapableBeanFactory

try {
    // Mark this bean as currently in creation, even if just partially.
    beforeSingletonCreation(beanName);
    // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
    instance = resolveBeforeInstantiation(beanName, mbd);
    if (instance == null) {
        bw = createBeanInstance(beanName, mbd, null);
        instance = bw.getWrappedInstance();
    }
}
finally {
    // Finished partial creation of this bean.
    afterSingletonCreation(beanName);
}

コメント付きで例外を黙って消化します// Finished partial creation of this bean.

これはアプリケーションの安定性に影響しませんか? なぜそのように設計されているのですか?
または、何か不足していますか?

4

1 に答える 1

1

ここには catch ステートメントがないことに注意してください。また、は でOutOfMemoryErrorはないExceptionので、標準的な一般的な に引っかかることはありませんcatch (Exception e)

このfinally句でThrowableは、キャッチされません。どこかで捕まえる(消化する)必要があります。

なぜSpringはその仕事を続けているのですか? スタンドアロンの専用アプリではなく、Web サーバーに基づいているのに、なぜすぐに動作を停止する必要があるのですか? すべての例外が重大というわけではありません。エラーでさえ、ときどき (... まれに) 回復できる場合があります。Spring のものではなく、すべての「彼の」スロー可能オブジェクトが適切に処理されるようにすることは、プログラマーの義務です。

于 2013-09-06T11:41:59.500 に答える