На самом деле существует очень элегантный способ получить свой торт и съесть его, т. Е. Иметь синглтон JVM, который также управляется Spring.Допустим, у вас есть чистый Java-синглтон с автоматическим компонентом, подобным этому:
public final class MySingletonClass{
private static MySingletonClass instance;
public static MySingletonClass getInstance(){
if(instance==null){
synchronized{
if(instance==null){
instance = new MySingletonClass();
}
}
}
return instance;
}
@Autowired
private SomeSpringBean bean;
// other singleton methods omitted
}
Вы можете заставить Spring управлять этим синглтоном, просто добавив в контекст приложения следующую строку:
<bean class="com.mypackage.MySingletonClass" factory-method="getInstance"/>
Теперь в вашем синглтоне будет экземпляр SomeSpringBean
с автопроводкой (если он доступен в контексте).
Более того, это «исправление» типичной проблемы с одноэлементными компонентами Spring, которые на самом деле не являются синглетами JVM, посколькуони получают экземпляр от Spring.Использование вышеприведенного шаблона обеспечивает использование одноэлементного уровня JVM, т. Е. Одноэлементного режима, поддерживаемого компилятором, вместе с одноэлементным контейнером.