Я конвертирую синглтон в Spring bean, так что, если singleton не удается инициализировать, контекст полного веб-приложения Spring не загружается должным образом.
Преимущество в том, что контекст Spring не загружается должным образом, заключается в том, что люди будут замечать и исправлять конфигурацию во время развертывания. В отличие от использования 'non spring bean' singleton: когда это генерирует исключение во время инициализации, никто не замечает.. пока фактический пользователь не пожалуется на недостающие функциональные возможности.
Мои изменения работают так, как ожидалось. но я не уверен, что я поступаю правильно.
Любые мысли?
Код выглядит следующим образом:
public class MySingleton {
private static MySingleton INSTANCE = null;
private MySingleton(){}
public static MySingleton getInstance(){
if(INSTANCE == null){
synchronized(MySingleton.class){
if(INSTANCE == null){
try{
doWork()
}catch(Exception e){
throw new IllegalStateException("xyz", e);
}
INSTANCE = new MySingleton();
}
}
}
return INSTANCE;
}
private static void doWork() {
// do some work
}
}
И в Spring config xml, bean будет определен как:
<bean id="MySingletonBean"
class="com.MySingleton"
factory-method="getInstance" lazy-init="false" singleton="true">
</bean>
Примечание: Большинство из них аналогично стратегии, обсуждаемой в этой статье: http://springtips.blogspot.com/2007/06/configuration-hell-remedy-with.html
Изменить 1:
Классы, которые используют этот синглтон, не сами Spring beans.. они просто не-w763 > pojos, что я не могу преобразовать в spring. Они должны полагаться на метод getInstance(), чтобы получить синглтон.
Изменить 2: (копирование комментария, сделанного ниже в этом разделе описания) Я пытаюсь настроить две вещи:
- Я хочу, чтобы Spring инициализировал синглтон. Так что если инициализация завершается неудачей, загрузка приложения не выполняется.
- Я хочу, чтобы другие классы могли использовать классы, не полагаясь на contextAwareObj.getBean( "MySingleton" )
РЕДАКТИРОВАТЬ 3 (ОКОНЧАТЕЛЬНЫЙ): Я решил сделать этот класс синглом... и не делаю его Spring bean. Если он не будет инициализирован, он будет записывать что-то в файл журнала. Мы надеемся, что человек, выполняющий развертывание, заметит... Я отказался от подхода, о котором я упоминал ранее, потому что я чувствую, что в будущем он создаст кошмар для обслуживания, поэтому мне пришлось выберите между - singleton - или - Spring bean. Я выбрал синглтон.