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 автоматически: после выдачи объекта он не отслеживает полный жизненный цикл.
Вопросы для повторения
- Singleton один на JVM? Нет, один на definition в контексте.
- Создаётся ли prototype на каждый вызов его метода? Нет, на каждый запрос экземпляра у контейнера.
- Почему request-bean нельзя просто внедрить в singleton? Их жизненные циклы различаются; нужен provider или scoped proxy.
- Делает ли singleton код потокобезопасным? Нет.
Связано: Жизненный цикл бина, Spring Context, Способы внедрения зависимостей Spring.