2012-06-12 3 views
0

Предположим, что я использую реализацию ApplicationContext весной.Как я могу реализовать существующую реализацию класса Java/интерфейса singleton?

ApplicationContext - это интерфейс в Java Spring Framework, и я не могу его изменить.

Как я могу гарантировать, что может быть только один экземпляр этой реализации?

Для примера. У меня есть следующий код -

public class ApplicationContextSingleton 
{ 
    private static ApplicationContext context; 
    private static int numberOfInstances = 0; 

    public static ApplicationContext getApplicationContext() 
    { 
     if(numberOfInstances == 0) 
     { 
      context = new ClassPathXmlApplicationContext("spring.xml"); 
      numberOfInstances++; 
     } 
     return context; 
    } 
} 

Таким образом, я могу гарантировать, что есть только один экземпляр ApplicationContext, при условии, что получается следующим образом -

ApplicationContext context = ApplicationContextSingleton.getApplicationContext(); 

Но это не мешает другой программист от говорящего -

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 

тем самым создавая новый ApplicationContext. Как предотвратить это?

+5

Воспитывая разработчиков? Если они используют Spring, они должны знать, по крайней мере, в основном, как работает Spring, и они не должны пытаться создать новый контекст. Если вы не доверяете своим разработчикам, как вы планируете запрещать бесконечные циклы? –

+0

Непонятно мне, что вы на самом деле просите - сделать этот класс одноэлементным не имеет ничего общего с тем, чтобы кто-либо снова не загружал конфигурацию контекста. –

+0

@JBNizet lol, это единственное решение, я полагаю! – CodeBlue

ответ

3

Вы хотите сделать одноклассник ApplicationContext, поэтому я бы переопределил класс своим собственным классом, убедитесь, что он появился сначала в классе путь и сделать его частным конструктором.

То есть, если вы мертвы, сделайте его одиночным. Есть более эффективные способы решения вашей проблемы, о чем свидетельствуют другие ответы и комментарии.

Следует иметь в виду, что обычно неправильно переопределять фрагменты библиотек, поскольку это может быть причиной головных болей позже, особенно когда вы пытаетесь обновить версию своей фреймворка.

+0

Я думаю, это возможно. Хорошая мысль –

+0

Как уже упоминалось в другом ответе, у вас будут проблемы с любым классом, который уже расширяет ApplicationContext. Он также предполагает, что вы работаете в среде, которая позволит вам определить порядок кластеров. – Robin

+0

согласился с @Robin. Просто потому, что вы *** можете *** что-то не означает, что вы *** должны ***. И это имеет место здесь. –

0

Josh Block предлагает использовать перечисление в Effective Java. This isnt a link to that book, но он показывает его и более старый способ (альтернативный) способ сделать это.

+1

проблема заключается не только в создании синглтона. он нуждается в обертке вокруг ресурса, а также – DarthVader

1

нет никакого способа, чтобы сделать это, потому что

ClassPathXmlApplicationContext не реализован в виде шаблона Singleton по весне. Сообщите каждому, что у вас есть метод утилиты для доступа к объекту контекста, и создание контекста с использованием нового дорого.

+0

Это имеет смысл. – CodeBlue

+0

Я не понимаю, как вы говорите, что нет никакого способа сделать это. Spring - это платформа с открытым исходным кодом и в любое время может быть отредактирована кем угодно. Даже не делая этого, вы всегда можете захватить загрузчик классов ... Для записи я не рекомендую ни один из этих параметров. Но «нет способа сделать это» - это сильные слова. – corsiKa

2

Если кто-то не может придумать что-то творческое, я не думаю, что есть способ сделать это. Это было бы похоже на попытку сделать одноэлементный номер int. Просто не случится, так как вы не имеете никакого контроля над использованием классов, которые вы не писали. Вам просто нужно будет доверять вашим разработчикам не создавать второй контекст.

В качестве альтернативы, и я почти обещаю, что это будет из вопроса, но вы могли получить полный источник весной, внести некоторые изменения в код, чтобы сделать контекст одноэлементно, а затем построить его самостоятельно , Не вероятное решение, но я все равно хотел указать на это.

1
  1. Используйте автоматическую систему сборки, которая строит ваш код всякий раз, когда он привязан к вашему репозиторию программного обеспечения.
  2. Интеграция инструментов в процесс сборки, например FindBugs или PMD. Если эти инструменты запускают определенные условия, не выполняйте сборку и не допускайте создания артефактов.
  3. Создайте случай в своем интегрированном инструменте, который ищет разработчиков, создающих свой собственный контекст.

Таким образом, вы не можете помешать им выполнить это, но вы можете помешать им проталкивать такие вещи в среду вашего разработчика, qa и prod. Это может показаться излишним, но этот процесс поможет с сотнями вещей, которые ваши разработчики могут делать, но не должны.

+1

Это единственный ответ, который я на самом деле предлагаю. +1 –

Смежные вопросы