← Назад к вопросам

Что такое Session Bean Scope?

2.0 Middle🔥 201 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Session Bean Scope в Spring

Session Bean Scope — это область видимости (scope) Spring Bean, которая связывает жизненный цикл bean с HTTP-сессией веб-приложения. Это значит, что новый экземпляр bean создаётся для каждой новой пользовательской сессии и существует ровно столько, сколько существует сама сессия.

Как это работает

Когда пользователь впервые обращается к приложению, Spring создаёт новый bean с областью действия session. Этот же объект будет использоваться для всех запросов этого пользователя в течение его сессии. Когда сессия завершается (пользователь вышел или истёк timeout), bean уничтожается.

Декларация в Spring

import org.springframework.web.context.annotation.SessionScope;
import org.springframework.stereotype.Component;

@Component
@SessionScope
public class UserSession {
    private String userId;
    private String userName;
    private List<String> permissions;
    
    public String getUserId() {
        return userId;
    }
    
    public void setUserId(String userId) {
        this.userId = userId;
    }
}

Пример использования

@RestController
@RequestMapping("/api/user")
public class UserController {
    
    private final UserSession userSession;
    
    public UserController(UserSession userSession) {
        this.userSession = userSession; // Будет той же сессии для каждого пользователя
    }
    
    @GetMapping("/profile")
    public ResponseEntity<?> getProfile() {
        // userSession содержит данные текущего пользователя
        return ResponseEntity.ok(userSession.getUserId());
    }
}

Отличие от других scopes

Singleton — один экземпляр на всё приложение (все пользователи делят один объект).

Prototype — новый экземпляр при каждом запросе к контексту.

Request — новый bean для каждого HTTP-запроса.

Session — новый bean для каждой HTTP-сессии.

Практическое применение

Session scope идеален для хранения пользовательских данных, которые нужны во время работы сессии:

@Component
@SessionScope
public class ShoppingCart {
    private List<CartItem> items = new ArrayList<>();
    private BigDecimal totalPrice = BigDecimal.ZERO;
    
    public void addItem(CartItem item) {
        items.add(item);
        recalculateTotal();
    }
    
    public List<CartItem> getItems() {
        return items;
    }
    
    private void recalculateTotal() {
        totalPrice = items.stream()
            .map(CartItem::getPrice)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}

Важные замечания

  • Thread-safety: Каждый пользователь получает свой bean, поэтому thread-safety гарантирован между сессиями, но внутри сессии возможны многопоточные обращения.
  • Сериализация: Если нужно сохранять сессию (кластеризация), bean должен быть Serializable.
  • WebApplicationContext: Session scope работает только в веб-контексте Spring, не в простом ApplicationContext.
  • Lazy инициализация: Bean может быть создан только при первом доступе к нему в сессии.