Создать Singleton с аргументами функции / конструктора (полезно, например, для инъекций) - PullRequest
0 голосов
/ 19 июля 2011

Мы используем пружину для создания / внедрения наших Java-бинов.Вот фрагмент:

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

Поскольку бин читает только некоторые свойства, которые всегда одинаковы, я сомневаюсь, что могут быть проблемы.Но мне по-прежнему любопытно, как реализовать хороший потокобезопасный способ. Конечно, существует блокировка с двойной проверкой с использованием volatile , которая является поточно-ориентированной.Но есть ли другой способ, возможно, использовать идиому Инициализация по требованию вместе с аргументами функции / конструктора?

1 Ответ

1 голос
/ 19 июля 2011
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-бинов), но это не всегда возможно.

Использование Spring (DI) в сочетании с одноэлементным шаблоном и явной синхронизацией потоков является своего рода анти-шаблонным и не очень необходимым. Фабрика bean-компонентов Spring сама по себе ориентирована на многопоточность, поэтому вам не нужно добавлять какие-либо дополнительные блокировки / синхронизацию поверх нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...