← Назад ко всем вопросам

В чем разница между областями видимости 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 используется для бинов, которые должны быть уникальными для каждого запроса.

Тема: Паттерны/SOLID
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки