2011-12-23 8 views
14

私はプロトタイプのBeanのインスタンスを作成するメソッドを持つシングルトンBeanを持っています。私はdocumented hereというメソッドを使ってプロトタイプBeanのインスタンスを取得しています。まずSpring - プロトタイプスコープのBeanを破壊するにはどうしたらいいですか?

public class SingletonService implements ApplicationContextAware { 

    private ApplicationContext applicationContext; 

    public void go() { 

     MyPrototypeBean prototype = applicationContext 
      .getBean(MyPrototypeBean.class); 

     prototype.doSomething(); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) 
     throws BeansException { 

     this.applicationContext = applicationContext; 
    } 
} 

私は、インスタンスが参照しないだろう、ガベージコレクトされることを意味し、「GO」メソッドが返されたときに「プロトタイプ」の私のインスタンスがスコープの外に出るであろうと、これは十分だと思いました。

しかし、ピアはthe documentationから次のステートメントを指摘:

クライアントコードは、プロトタイプ・スコープのオブジェクトをクリーンアップし、プロトタイプビーン(s)が保持されている 高価なリソースを解放しなければなりません。

だから、Springはリファレンスを保持しているようですので、gcは決してそれを拾いませんか?その場合、Springに参照を公開するように指示するにはどうすればよいですか?このドキュメントでは、「カスタムBeanポストプロセッサ」を使用できると述べていますが、そのプロセッサがどこに収まるのか、どのコードを実行するのかは明確ではありません。

手伝いのためのすべての事前のおかげで、 ロイ

答えて

12

私はあなたがドキュメントを誤解していると思います。 SpringがプロトタイプBeanのライフサイクルを管理しないということだけですので、@PreDestroy(など)メソッドは独自のコードで呼び出す必要があります。 Springは参照を保持しません。

+0

ありがとうございます。上記のコードは十分であり、メモリリークの原因にはならないと言っても過言ではありませんか? –

+1

これはMyPrototypeBeanの実装に依存しますが、Springの観点からはうまくいきます。 – artbristol

+0

Beanを取得するには、getBean(..)メソッドを使用しました。私はそれがパフォーマンスで多くのコストだと思いました。どのようにそれを取得する必要がありますか? – rayman

関連する問題