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