Как Spring автоматически внедряет бины с областями видимости @RequestScope и @SessionScope в синглтон-бины?

Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
  • 23 августа 2023 г. 9:06
Ответы на вопрос 2
Spring автоматически внедряет бины с областями видимости @RequestScope и @SessionScope в синглтон-бины с помощью проксирующих объектов.

При создании контекста Spring создает экземпляр синглтон-бина, который имеет поле с областью видимости @SessionScope. Это поле является проксированным объектом, который делегирует вызовы методов и доступ к полям соответствующему экземпляру бина, созданному для текущей сессии.

Когда открывается новая сессия, Spring создает новый экземпляр бина с областью видимости @SessionScope и связывает его с текущей сессией. Затем Spring обновляет проксированный объект в синглтон-бине, заменяя его новым экземпляром бина.

Таким образом, при открытии новой сессии поле "loggedUserManagementService" в классе "MainController" автоматически заполняется новым экземпляром класса "LoggedUserManagementService", связанным с текущей сессией.
Если вы поставите точку останова в методе "home" и изучите поле "loggedUserManagementService", вы увидите, что в нем хранится странный объект. На самом деле, Spring не инжектирует сами пользовательские объекты, а создает обертки (прокси) над ними. И в этих обертках могут использоваться разные экземпляры пользовательских объектов. Таким образом, достигается поведение, задаваемое аннотациями "@RequestScope", "@SessionScope", "@Lazy" и так далее. Для более подробной информации, рекомендую вам изучить следующие темы: JDK dynamic proxy, Spring AOP, CGLIB.
Похожие вопросы