java - 使用函数/构造函数参数创建单例(对于例如注入(inject)很有用)

标签 java spring design-patterns singleton

我们使用 spring 来构造/注入(inject)我们的 java beans。这是一个片段:

<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 与函数/构造函数参数一起?

最佳答案

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");
}

这是足够线程安全的。更好的是努力一直使用注入(inject)(通过注释或 XML bean 定义),但这并不总是可能的。

将 Spring (DI) 与单例模式和显式线程同步混合使用是一种反模式,并不是真正必要的。 Spring bean 工厂本身是线程安全的,因此您不需要在其上添加任何额外的锁定/同步。

关于java - 使用函数/构造函数参数创建单例(对于例如注入(inject)很有用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6746570/

相关文章:

java - 命令模式如何启用撤消?

java - 斯卡拉 : Registry design pattern or similar?

java - GWT 滚动处理程序

java - 将 jms 时间戳转换为当前日期和时间

html - 使用内容版本策略时在 Spring 中缓存破坏 @import css

java - Spring boot 无法解析带有名称的 View

wpf - 不清楚如何实现依赖注入(inject)

java - JCombobox模型如何使用?

java - 将数据写入字符串

java - 嵌入式类和双向关系