Какие scope бинов существуют в Spring
Что проверяют
Знаете ли вы не список из документации, а последствия смешивания областей видимости. Уточняющий вопрос почти обязателен: что получится, если внедрить prototype бин в singleton, и как это чинится.
Как отвечать
singleton: область по умолчанию, один экземпляр на контейнер, а не на JVM: в двух контекстах будет два объекта. Создаётся при старте, если не помечен@Lazy. Изменяемое состояние в таком бине это гонка, поля годятся только под зависимости и конфигурацию;prototype: новый экземпляр на каждое обращение к контейнеру. Важная деталь: до конца жизненным циклом контейнер не управляет,@PreDestroyне вызовется, освобождение ресурсов на вас;request: экземпляр на HTTP-запрос, короткая форма это@RequestScope;session: на HTTP-сессию,@SessionScope. Помните про размер и сериализацию, особенно когда инстансов приложения несколько;application: один объект наServletContext, аннотация@ApplicationScope;websocket: на время сессии WebSocket.
Добавьте, что набор расширяем: refresh в Spring Cloud, job и step в Spring Batch, свои области через интерфейс Scope и CustomScopeConfigurer.
Главная содержательная часть это смешивание. Если внедрить prototype в singleton напрямую, экземпляр создастся один раз при сборке зависимостей и застрянет там навсегда. Рабочие решения: @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS), внедрение ObjectProvider<T> с вызовом getObject() в нужный момент, метод с @Lookup. У веб-областей ровно та же проблема, поэтому @RequestScope и @SessionScope включают прокси по умолчанию.
Где спотыкаются
Называют singleton синглтоном уровня приложения. Это область контейнера, и паттерн из книги про шаблоны тут ни при чём.
Держат пользовательское состояние в singleton сервисе. На отладке в один поток всё работает, под нагрузкой данные разных пользователей перемешиваются.
Обращаются к request и session бинам вне веб-запроса: из планировщика, из асинхронного потока, из теста без веб-контекста. Прокси выбрасывает исключение о том, что к потоку не привязан запрос.