Scope бинов Spring

Scope определяет, когда контейнер создаёт экземпляр и как долго его возвращает.

ScopeОбласть
singletonодин экземпляр на один контекст и bean definition
prototypeновый экземпляр при каждом запросе у контейнера
requestодин экземпляр на HTTP-запрос
sessionодин на HTTP-сессию
applicationодин на ServletContext
websocketодин на WebSocket-сессию

singleton Spring — не классический singleton JVM: в двух контекстах будут разные экземпляры.

Короткоживущий bean внутри singleton

Prototype, напрямую внедрённый в singleton, создаётся один раз во время создания singleton. Для получения нового экземпляра используют:

  • ObjectProvider<T>;
  • factory;
  • scoped proxy;
  • lookup method.
class ExportService {
    private final ObjectProvider<ExportJob> jobs;
 
    ExportJob newJob() {
        return jobs.getObject();
    }
}

Контейнер не вызывает destruction callback у prototype автоматически: после выдачи объекта он не отслеживает полный жизненный цикл.

Вопросы для повторения

  1. Singleton один на JVM? Нет, один на definition в контексте.
  2. Создаётся ли prototype на каждый вызов его метода? Нет, на каждый запрос экземпляра у контейнера.
  3. Почему request-bean нельзя просто внедрить в singleton? Их жизненные циклы различаются; нужен provider или scoped proxy.
  4. Делает ли singleton код потокобезопасным? Нет.

Связано: Жизненный цикл бина, Spring Context, Способы внедрения зависимостей Spring.