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

Какие знаешь типы контекстов?

2.0 Middle🔥 131 комментариев
#Spring Framework

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

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

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

Типы контекстов в Java

Контекст — это объект, который предоставляет информацию о приложении или текущему потоку выполнения. В Java существует несколько типов контекстов, каждый из которых имеет свою область видимости и назначение.

1. Application Context

Application Context — это глобальный контекст приложения, который существует в течение всего времени жизни приложения. Он используется для хранения глобальных данных и ресурсов.

public class ApplicationContext {
    private static ApplicationContext instance;
    private Map<String, Object> resources = new ConcurrentHashMap<>();
    
    public static synchronized ApplicationContext getInstance() {
        if (instance == null) {
            instance = new ApplicationContext();
        }
        return instance;
    }
    
    public void setResource(String key, Object value) {
        resources.put(key, value);
    }
    
    public Object getResource(String key) {
        return resources.get(key);
    }
}

Применение:

  • Хранение конфигурации приложения
  • Глобальные сервисы и утилиты
  • Пулы потоков и подключений к БД

2. Request Context

Request Context — контекст отдельного HTTP запроса. Существует только во время обработки запроса и содержит информацию, специфичную для этого запроса.

public class RequestContext {
    private final String requestId;
    private final long timestamp;
    private final Map<String, String> headers;
    private final String userId;
    
    public RequestContext(String requestId, Map<String, String> headers) {
        this.requestId = requestId;
        this.timestamp = System.currentTimeMillis();
        this.headers = headers;
        this.userId = headers.getOrDefault("X-User-Id", "anonymous");
    }
    
    public String getRequestId() {
        return requestId;
    }
    
    public String getUserId() {
        return userId;
    }
}

Применение:

  • Трассировка запроса (request ID)
  • Аутентификация и авторизация
  • Логирование с контекстом запроса

3. Thread-Local Context

ThreadLocal — специальный тип контекста для хранения данных, привязанных к конкретному потоку. Каждый поток имеет свою копию данных.

public class ThreadLocalContext {
    private static final ThreadLocal<RequestContext> context = 
        ThreadLocal.withInitial(() -> null);
    
    public static void set(RequestContext requestContext) {
        context.set(requestContext);
    }
    
    public static RequestContext get() {
        return context.get();
    }
    
    public static void clear() {
        context.remove();
    }
}

Применение:

  • Передача контекста между методами без параметров
  • MDC (Mapped Diagnostic Context) в логировании
  • Управление транзакциями

4. Session Context

Session Context — контекст пользовательской сессии, который существует на протяжении всей сессии пользователя.

public class SessionContext {
    private final String sessionId;
    private final String userId;
    private final long createdAt;
    private final Map<String, Object> attributes = new ConcurrentHashMap<>();
    
    public SessionContext(String sessionId, String userId) {
        this.sessionId = sessionId;
        this.userId = userId;
        this.createdAt = System.currentTimeMillis();
    }
    
    public void setAttribute(String name, Object value) {
        attributes.put(name, value);
    }
    
    public Object getAttribute(String name) {
        return attributes.get(name);
    }
}

Применение:

  • Хранение пользовательских данных
  • Кэширование пользовательских предпочтений
  • Управление корзиной в e-commerce

5. Context в Spring Framework

Spring предоставляет собственную реализацию контекстов через ApplicationContext интерфейс.

// Инициализация контекста
ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");

// Получение бина из контекста
UserService userService = context.getBean(UserService.class);

// Использование контекста
User user = userService.findById(1);

Сравнение типов контекстов

ТипОбласть видимостиВремя жизниПотокобезопасность
ApplicationГлобальнаяВсе приложениеТребуется синхронизация
RequestОдин запросНа время запросаОбычно безопасен
ThreadLocalОдин потокНа время потокаДа, по определению
SessionОдна сессияНа время сессииТребуется синхронизация

Лучшие практики

  • Всегда очищай ThreadLocal после использования, чтобы избежать утечек памяти
  • Используй контексты минимально — передавайте параметры явно, когда возможно
  • Будь осторожен с синхронизацией при работе с глобальными контекстами
  • Документируй жизненный цикл контекста в своем коде