2

私は春のフレームワークが初めてです。singleton が true で xml ファイルに destroy メソッドを指定してプログラムを実行すると、指定された destroy メソッドが実行されますが、singleton が false の場合は実行されません。

Google で検索しているときに、どこかで、Spring は非シングルトン Bean の完全なライフサイクルを管理できないことを知りました。次に、どうすればその Bean を破棄できますか。また、Spring が非シングルトン Bean の完全なライフサイクルを管理できない理由は何ですか。

前もって感謝します。

4

2 に答える 2

2

Bean が Spring の場合singleton、それを要求するたびに、Spring は同じものを返します。このため、Spring は常にこの Bean のハンドルを保持する必要があり、ApplicationContextシャットダウン時に Spring が破棄できるようになります。

Bean が Springsingletonでない場合、Bean を要求するたびに、その新しいインスタンスを (同じ構成で) 取得します。ApplicationContextSpring はこれらの Bean を保持する必要がないため、ハンドルを保持しません。ハンドルがない場合、シャットダウン時にメソッドを呼び出してそれらを破棄するにはどうすればよいでしょうか? 彼らはできません。

ここで、なぜ Spring は非シングルトン スコープから作成された Bean のリストを保持しないのかと疑問に思うかもしれません。まあ、1つの問題はメモリでしょう。これが長期間存続するアプリで、多くのリクエストが多くのprototypeスコープ Bean を作成している場合、Spring が多くのオブジェクトを追跡していることがわかり、貴重なメモリを消費する可能性があります。

確かに他にも潜在的な問題があり、ここにリストするには多すぎる可能性があるため、そのままにしておきます.

于 2013-01-04T18:27:44.877 に答える
1

リファレンス ドキュメントのセクション 5.5.2から:

他のスコープとは対照的に、Spring はプロトタイプ Bean の完全なライフサイクルを管理しません。コンテナーは、プロトタイプ オブジェクトをインスタンス化し、構成し、その他の方法でアセンブルし、それをクライアントに渡します。そのプロトタイプ インスタンスのそれ以上の記録はありません。したがって、初期化ライフサイクル コールバック メソッドはスコープに関係なくすべてのオブジェクトで呼び出されますが、プロトタイプの場合、構成された破棄ライフサイクル コールバックは呼び出されません。クライアント コードは、プロトタイプ スコープのオブジェクトをクリーンアップし、プロトタイプ Bean が保持している高価なリソースを解放する必要があります。Spring コンテナーがプロトタイプ スコープの Bean によって保持されているリソースを解放するようにするには、クリーンアップする必要がある Bean への参照を保持するカスタム Bean ポスト プロセッサを使用してみてください。

いくつかの点で、プロトタイプ スコープの Bean に関する Spring コンテナーの役割は、Java の new 演算子に代わるものです。その時点以降のすべてのライフサイクル管理は、クライアントが処理する必要があります。(Spring コンテナー内の Bean のライフサイクルの詳細については、セクション5.6.1「ライフサイクル コールバック」を参照してください。)

その理由は、プロトタイプを使用するときに破壊を処理しないことにしたためです。許可された場合、予期しない問題が発生する可能性があることに気付いたのかもしれません。申し訳ありませんが、自分で破壊に対処する必要があります。

もう少し考えてみると、それは理にかなっていると思います。メソッドを何度も呼び出すと、常に Bean の新しいコピーを受け取ります。また、Spring Container は、コンテナーのシャットダウン時にそれぞれの dispose メソッドを呼び出す場合、各コピーへの参照を保持する必要があります。これにより、不快なメモリ消費が発生します。

于 2013-01-04T18:26:41.380 に答える