2011-12-16 7 views
2

私はステートフルSpring Beanを持っています。アプリケーションのプロトタイプに使用範囲を適用するにはどうすればよいですか?Spring Beanのプロトタイプスコープを適用する方法

シングルトンスコープでこのBeanを注入するプロジェクトで別の開発者を防ぐ方法を教えてください。

私は、アノテーションまたはxml設定を介してスコープを設定できることを知っています。私が見たことのうち、Spring 3を使用する場合、アノテーションで設定されたスコープはxmlで手動で定義されたスコープによって上書きされます。どのようにして設定やプログラマチックにスコープを強制することができますか?私のbeanはシングルトンとして使われることはありませんか?

私は、アプリケーションの起動時にBeanスコープを調べることを考えましたが、それは優雅な解決策のようには聞こえません。

+0

探しているものを達成するための唯一の方法であります二度とbean定義に行き、とにかくシングルトンを望んだと思ったらそれを変更してください。あなたの同僚の不正行為からあなたのコードを保護しようとするよりも優先度の高い方法があります。 – Affe

+0

だから私は、アプリケーションの起動時にテストアプローチについて考えたのですが、私はそれが良い解決策であるとは確信していません。あまりにも守備的ではないはずですが、私の問題は、メモリが足りなくなるまで、このBeanの悪いスコープを使用することです。それは見つけにくいし、再び起こるかもしれない。ピアツーピアはコードのすべての行を見直すことでそれを防ぐかもしれませんが、私たちには人力も管理者もそうする意志がありません。 – somecto

答えて

3

これはエレガントではありませんが、私の知る限り、これはあなたがから身を「守る」しようとしている人々が考えていないのと同じ人がいる

public class MyStatefulBean implements InitializingBean, ApplicationContextAware, BeanNameAware { 

    private String myName; 

    private ApplicationContext context; 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     this.context = applicationContext; 
    } 

    @Override 
    public void setBeanName(String s) { 
     this.myName = s; 
    } 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     if(this.context.isSingleton(this.myName)) 
      throw new RuntimeException("Bean CANNOT be singleton"); 
    } 
} 
+0

私は、コードベースの重要な部分を誤用から守る必要があるときに、優雅さは時には後から考えられると思います。ありがとう。 – somecto

0

これを文書化しますか?誰かがBeanへの参照を保持しているかどうかを知ることができず、プロトタイプを取得するためにgetBean()を使用していたはずのスレッド間で共有することはできません。

春は、単に間違っているコードを書き込むことを止めることはできません。これは、そのような使用法のすべてです。

+0

十分ですが、Springは私の同僚がBeanのスコープの設定を無効にするのを止めることができますか? (レコードについては、これは文書化されていますが、いくつかのゴーフはそれを読み取っておらず、生産時にメモリリークが発生しました) – somecto

0

APIユーザーが期待していることに頼りたくない場合は、工場からBeanを公開してください。

+0

Spring ServiceLocatorFactoryBeanを使用すると、とにかく設定が上書きされます。何か案は? – somecto

+0

@sebulどのように設定が上書きされますか? –

+0

それはそれを上書きしませんが、最初のものをインポートする別のSpring設定では上書き可能です。実際には、アノテーションで定義されたスコープがxmlで定義されたスコープよりも優先されることが、私が好むものです。それ以外の場合、Springが文字通り過度に使用されているアプリでは、xml configでスコープをオーバーライドする危険性が高くなります。特に、複数のレベルのSpring設定ファイルがある場合。 – somecto

関連する問題