Ответ
Ключевое отличие — в хранении и управлении жизненным циклом.
| Аспект | 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 - разные объекты