Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 может быть создан только при первом доступе к нему в сессии.