2012-06-08 13 views
5

私は徐々に春のグリップをしてきましたが、コンセプトの合理的な考え方があると思いますが、別のスレッドの情報が逆転した私...春のプロトタイプの豆と春の利点

」...初期のライフサイクルコールバックメソッドは、設定され破壊のライフサイクルコールバックが呼び出されていない、試作品の場合には、関係なく、スコープのすべてのオブジェクトで呼び出されているが、クライアントコードはprototype-をクリーンアップする必要がありますプロトタイプスコープのBeanで保持されているリソースを解放するためにSpringコンテナを取得するには、カスタムBeanポストプロセッサを使用してみてください。きれいにするためにeed。

これは、たとえば、要求ごとに「新しい」Beanインスタンスが必要な場合に、プロトタイプBeanを使用したいと考えている実際の使用例があると思いました。しかし、私はこのスニペット(Spring 3のドキュメントから)を理解しているから、Springは、掃除が必要なBeanへの参照を保持しています(参照自体はBeanがガベージコレクタによって自動的にクリアされないことを意味します)。さらに、プロトタイプBeanが保持するリソースを手作業でクリーンアップする必要があるということから、このことを取り上げます。

これが正しいのか誰かに教えてもらえますか?もしそうなら、これに対処する典型的なパターンがありますか? SpringがこのようにプロトタイプのBeanを実装する理由について、私が解説してくれれば幸いです。

+1

;)http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference /html/ch04s04.html –

+0

@Spaeth私は誤解を招いている可能性があります...これはWebアプリケーションではない、私はちょうど起こっている "何か"を処理するために作成される新しいインスタンスの必要性を実証しようとしていた – JLove

答えて

13

Springは、クリーンアップが必要なBeanへの参照を保持しています(参照自体は、Beanがガベージコレクタによって自動的にクリアされないことを意味します)。

はい、ただし、コンテナにプロトタイプスコープのBeanへの参照が保持されていません。これは破壊コールバックが呼び出されない理由です:SpringはBeanインスタンスを作成し、それをワイヤリングし、コールバックを呼び出します。それはインスタンスを与え、そのBeanを忘れてしまいます。

要求ごとにプロトタイプスコープBeanを安全に作成することができます。 Springはあなたにインスタンスを与え、そのBeanへの参照を持たない瞬間(Springはそれを保持しません!)、それはガベージコレクションされます。しかし、Springは作成後にBeanについて何も知らないので、破壊コールバックを呼び出すことはできません。実際、これは、なぜJavaがデストラクタを持っていないのかという疑問に結びついています。

プロトタイプスコープのBeanをどのようにクリーンアップしますか?さて、Javaの他のリソースを明示的にクリーンアップするように - 明示的に。 close()destroy()stop()などの名前を付けてください(Closeableの実装を検討してください)。ガベージコレクタはオブジェクトグラフ全体を解放しますが、DataSourceが閉じられるとデータベース接続のような永続リソースは閉じられます。

+1

ありがとう答え...これはこのスニペットを読む前に私がそれが信じていた方法でした、おそらく私はちょうどそれを誤解しました!基本的に...前と同じように続けて、破壊の痕跡を残してください。すべてが私の後ろで浄化されます:-) – JLove

7

あなたはドキュメントを読み違えることが明示的に述べている:。

を プロトタイプスコープの豆が保持しているリソースを解放するためにSpringコンテナを取得するには、 はへの参照を保持しているカスタム豆ポストプロセッサを、使用してみてください豆はcにする必要があります腰を下ろした。

したがって、Springは作成するプロトタイプBeanへの参照を保持しません。必要に応じて、これらのBeanへの参照を保持するBeanポストプロセッサを作成するのはあなた次第です。

さらに、クリーンアップする必要があるリソースをプロトタイプBeanに保持することはまれです。たとえば、接続プール(シャットダウン時に正しく破棄する必要があります)は、通常はシングルトンBeanです。それをプロトタイプにするのはあまり意味がありません。プロトタイプBeanはしばしば少量の時間使用されるので、それを作成するクライアントは、もはやそれを使用しないときにリソースを明示的に解放することができます。新しいストリームや接続を作成してfinallyブロックで閉じるときと同じです。

3

Springには、プロトタイプスコープを使用して作成されたすべてのインスタンスに関する知識がありません。プロトタイプのスコープ付きBeanをインスタンス化して構成し、ドキュメントにコメントされたとおりにクライアントに渡します。

春はプロトタイプBeanのライフサイクル全体を管理していません: コンテナは、インスタンス構成し、飾ると、そうでない場合 にプロトタイプオブジェクトを組み立て、それをクライアントに渡し、次にそのプロトタイプのインスタンスのさらなる 知識を持っていません。あなたはそれはあなたがユーザーのリクエストスコープをすることができます要求によってスコープ必要がある場合には

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html#beans-factory-scopes-prototype

関連する問題