2011-07-19 6 views
0

私たちはJava beanを構築/挿入するためにspringを使用します。ここでは、スニペット:Beanが唯一、常に私は問題がある可能性が疑う同じですいくつかのプロパティを読んでいるので関数/コンストラクタ引数を持つシングルトンを作成する(例えば、注入などに便利です)

<bean id="myAppConfigs" class="my.cool.webapp.ApplicationConfig" scope="singleton"> 
    <constructor-arg value="8080" /> 
    <constructor-arg value="MyAppName1" /> 
</bean> 

我々は

public static ApplicationConfig getCurrentInstance(ServletContext sctx) { 
    if (instance == null) { 
       WebApplicationContext wac = null; 
       if (sctx != null) { 
        wac = WebApplicationContextUtils.getWebApplicationContext(sctx); 
       } 
return (ApplicationConfig) wac.getBean("myAppConfigs"); 

にシングルトンパターンを使用しています。しかし、私はそれを実装する素晴らしいスレッド安全な方法についてはまだ興味があります もちろん、スレッドセーフであるDouble Checked Locking with usage of volatileがあります。 しかし、Initialization on demand holder idiomを関数/コンストラクタ引数と共に使用する別の方法がありますか?

+0

これはJSFとどのくらい正確に関連していますか? – BalusC

答えて

1
public static ApplicationConfig getCurrentInstance(ServletContext sctx) { 
    if (sctx == null) { 
    throw new AssertionError("ServletContext is null"); 
    } 
    WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(sctx); 
    if (wac == null) { 
    throw new AssertionError("No ApplicationContext associated with ServletContext"); 
    } 
    return (ApplicationConfig) wac.getBean("myAppConfigs"); 
} 

これはスレッドセーフです。さらに、(注釈やXML Beanの定義のいずれかを介して)インジェクションを使用するように努力する方が良いでしょうが、それは必ずしも可能ではありません。

シングルトンパターンと明示的なスレッド同期を混在させて使用すると、パターンニスのようになり、実際には必要ありません。 Spring Beanファクトリ自体はスレッドセーフなので、追加のロック/シンクを追加する必要はありません。

関連する問題