В чем разница между областями видимости Singleton и Prototype в Spring
1️⃣ Как кратко ответить
В Spring область видимости Singleton означает, что контейнер создает только один экземпляр бина на весь контекст, и все запросы к этому бину возвращают один и тот же объект. Область видимости Prototype означает, что контейнер создает новый экземпляр бина при каждом запросе.
2️⃣ Подробное объяснение темы
В Spring Framework области видимости (scopes) определяют жизненный цикл и видимость бинов, управляемых контейнером. Две наиболее часто используемые области видимости — это Singleton и Prototype.
Singleton Scope:
-
Что это: Singleton — это область видимости по умолчанию в Spring. Когда бин объявлен с этой областью видимости, Spring создает только один экземпляр этого бина на весь контекст приложения. Все запросы к этому бину возвращают один и тот же объект.
-
Как работает: Когда контейнер Spring инициализируется, он создает экземпляр каждого бина с областью видимости Singleton. Этот экземпляр хранится в кэше контейнера, и все последующие запросы к этому бину возвращают ссылку на этот единственный экземпляр.
-
Пример использования: Singleton подходит для бинов, которые не содержат состояния или содержат состояние, общее для всех пользователей приложения, например, для сервисов, управляющих конфигурацией или подключением к базе данных.
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SingletonExample {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// Получаем бин с именем "myBean" дважды
MyBean bean1 = (MyBean) context.getBean("myBean");
MyBean bean2 = (MyBean) context.getBean("myBean");
// Проверяем, что оба объекта ссылаются на один и тот же экземпляр
System.out.println(bean1 == bean2); // true
}
}
- Комментарии к коду:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");: Создаем контекст приложения, который загружает конфигурацию из файлаbeans.xml.MyBean bean1 = (MyBean) context.getBean("myBean");: Получаем бин с именемmyBean.MyBean bean2 = (MyBean) context.getBean("myBean");: Получаем тот же бин еще раз.System.out.println(bean1 == bean2);: Проверяем, что оба объекта ссылаются на один и тот же экземпляр, выводяtrue.
Prototype Scope:
-
Что это: Prototype — это область видимости, при которой Spring создает новый экземпляр бина каждый раз, когда он запрашивается из контейнера.
-
Как работает: В отличие от Singleton, при каждом запросе к бину с областью видимости Prototype контейнер создает новый экземпляр. Это означает, что каждый вызов
getBean()возвращает новый объект. -
Пример использования: Prototype подходит для бинов, которые содержат состояние, специфичное для каждого пользователя или процесса, например, для объектов, представляющих сессии или временные данные.
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class PrototypeExample {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// Получаем бин с именем "myPrototypeBean" дважды
MyBean bean1 = (MyBean) context.getBean("myPrototypeBean");
MyBean bean2 = (MyBean) context.getBean("myPrototypeBean");
// Проверяем, что оба объекта ссылаются на разные экземпляры
System.out.println(bean1 == bean2); // false
}
}
- Комментарии к коду:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");: Создаем контекст приложения, который загружает конфигурацию из файлаbeans.xml.MyBean bean1 = (MyBean) context.getBean("myPrototypeBean");: Получаем бин с именемmyPrototypeBean.MyBean bean2 = (MyBean) context.getBean("myPrototypeBean");: Получаем бин еще раз, но теперь это новый экземпляр.System.out.println(bean1 == bean2);: Проверяем, что оба объекта ссылаются на разные экземпляры, выводяfalse.
Заключение:
Выбор между Singleton и Prototype зависит от требований вашего приложения. Singleton подходит для бинов, которые должны быть уникальными в контексте приложения, в то время как Prototype используется для бинов, которые должны быть уникальными для каждого запроса.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться