TGViewer
Java | Вопросы собесов Java | Вопросы собесов @easy_java_ru · 11.3K subscribers
Post #1962 2.3K
🤔 Есть ли возможность создать два Singleton'а в Spring'е

В Spring действительно можно создать два синглтона, но тут важно понимать, что Spring использует паттерн Singleton на уровне контейнера, а не на уровне JVM. Давайте разберёмся, как это возможно.

🟠Определение Singleton в Spring
В Spring синглтон означает, что в рамках одного контекста (ApplicationContext) создаётся один экземпляр бина.
@Component
public class MySingletonBean {
public MySingletonBean() {
System.out.println("Создан экземпляр MySingletonBean");
}
}


🟠Два Singleton'а в Spring? Как это возможно?
Есть несколько способов создать два синглтона.
Создание двух контекстов (ApplicationContext)
Spring гарантирует синглтонность только в одном контексте. Если создать два контекста, можно получить два независимых синглтона.
AnnotationConfigApplicationContext context1 = new AnnotationConfigApplicationContext(AppConfig.class);
AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class);

MySingletonBean bean1 = context1.getBean(MySingletonBean.class);
MySingletonBean bean2 = context2.getBean(MySingletonBean.class);

System.out.println(bean1 == bean2); // false! Два разных объекта


Определение двух бинов одного типа
Можно создать два разных бина, просто давая им разные имена в конфигурации.
@Configuration
public class AppConfig {

@Bean
public MySingletonBean firstSingleton() {
return new MySingletonBean();
}

@Bean
public MySingletonBean secondSingleton() {
return new MySingletonBean();
}
}


Теперь оба метода создадут разные объекты.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

MySingletonBean bean1 = context.getBean("firstSingleton", MySingletonBean.class);
MySingletonBean bean2 = context.getBean("secondSingleton", MySingletonBean.class);

System.out.println(bean1 == bean2); // false


Изменение области (scope) бина
Если изменить область (@Scope), можно получить два экземпляра в одном контексте, но тогда это уже не будет синглтон.
@Component
@Scope("prototype")
public class MyBean {
public MyBean() {
System.out.println("Создан новый экземпляр MyBean");
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 7
  • 🔥 2
More from @easy_java_ru
  1. Oct 4, 2026Post #2943
  2. Oct 4, 2026🤔 Что необходимо для того чтобы клонировать один объект в другой? Для клонирования объект…
  3. Oct 4, 2026🤔 Что такое сигнатура? Сигнатура метода – это его уникальная идентификация в классе. Она…
  4. Oct 4, 2026Post #2940
  5. Oct 3, 2026🤔 В каких состояниях может находиться поток? Поток может находиться в следующих состояния…
  6. Oct 3, 2026Post #2938
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →