使用函数/构造函数参数创建Singleton(对于例如注入有用)

时间:2011-07-19 11:43:06

标签: java spring design-patterns singleton

我们使用spring来构造/注入我们的java 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");

由于bean只读取了一些总是相同的属性,我怀疑可能存在问题。但我仍然很好奇一个很好的线程安全方法来实现它 当然Double Checked Locking with usage of volatile是线程安全的。 但是,还有另一种方法可以将Initialization on demand holder idiom 与函数/构造函数参数一起使用吗?

1 个答案:

答案 0 :(得分: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(DI)混合单例模式和显式线程同步是一种反模式,而不是真正的必要。 Spring bean工厂本身就是线程安全的,所以你不需要在它上面添加任何额外的锁定/同步。