В чем ключевое отличие в управлении контекстом Spring для бинов Singleton и Prototype?

«В чем ключевое отличие в управлении контекстом Spring для бинов Singleton и Prototype?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое отличие — в хранении и управлении жизненным циклом.

Аспект Singleton (@Scope("singleton")) Prototype (@Scope("prototype"))
Количество экземпляров Один на контейнер Новый при каждом запросе/инъекции
Хранение в контексте Контейнер хранит и возвращает один и тот же объект Контейнер создает, инициализирует и возвращает объект, но не хранит ссылку на него
Управление уничтожением Контейнер вызывает методы разрушения при закрытии Контейнер НЕ вызывает методы разрушения
Использование памяти Экономично, один экземпляр Потенциально затратно, много экземпляров
Потокобезопасность Требует осторожности (состояние разделяется) Безопаснее (каждый поток получает свой экземпляр)

Пример создания:

@Configuration
public class Config {
    @Bean // По умолчанию singleton
    public Service singletonService() {
        return new Service(); // Создастся ОДИН раз
    }
    @Bean
    @Scope("prototype")
    public Service prototypeService() {
        return new Service(); // Создастся МНОГО раз
    }
}
// Использование:
ApplicationContext ctx = ...
Service s1 = ctx.getBean("singletonService");
Service s2 = ctx.getBean("singletonService");
System.out.println(s1 == s2); // true - один объект
Service p1 = ctx.getBean("prototypeService");
Service p2 = ctx.getBean("prototypeService");
System.out.println(p1 == p2); // false - разные объекты