Паттерн "Заместитель" (Proxy) в Java — доступ, кэш и lazy loading
Модель и масштаб — Основы БД, опорные темы, проектирование БД, пакетная работа. Карта — о разделе.
Обзор — в структурных паттернах. Здесь — Proxy на Java — объект с тем же интерфейсом, что и "настоящий" сервис, но с перехватом до/после вызова.
Play ITЗагрузка интерактивного демо…
Задача паттерна
Proxy подменяет реальный объект суррогатом с тем же контрактом. Клиент вызывает прокси; прокси может проверить права, закэшировать ответ или отложить создание тяжёлого объекта.
Пример — документы с доступом и кэшем
Код ITЗагрузка примера кода…
SecurityContext.setCurrentRole("ADMIN");
DocumentService service = new DocumentServiceProxy(Set.of("ADMIN", "EDITOR"));
String doc = service.loadDocument("report-2026");
Виды прокси в Java
| Тип | Задача | Пример |
|---|---|---|
| Virtual (виртуальный) | Отложить создание тяжёлого объекта | Hibernate lazy-прокси (JPA), загрузка превью по клику |
| Remote (удалённый) | Вызов объекта в другой JVM/сервисе | RMI, gRPC-клиент |
| Protection (защитный) | Проверка прав до вызова | Spring Security, пример DocumentServiceProxy выше |
| Caching | Кэш ответа | computeIfAbsent в примере выше |
| Logging / metrics | Наблюдаемость | Spring AOP @Around |
Обзор ролей заместителя — в структурных паттернах. Виртуальный и удалённый прокси решают разные задачи и часто оформляются отдельными классами.
JDK динамические прокси (java.lang.reflect.Proxy) и ByteBuddy/CGLIB в Spring создают прокси во время выполнения без ручного класса-обёртки.
Proxy и Decorator
| Proxy | Decorator | |
|---|---|---|
| Фокус | Контроль доступа и жизненного цикла | Добавление поведения |
| Клиент | Может не знать о существовании real subject | Ожидает цепочку обёрток |
| Пример | Lazy load, security | new BufferedInputStream(new FileInputStream(...)) |
Когда применять и риски
Прокси уместен, когда нужен прозрачный контроль без изменения клиентского кода.
Несколько слоёв прокси (AOP + security + cache) усложняют отладку и добавляют задержку — логируйте цепочку перехватчиков в dev-среде.
См. также
- Структурные паттерны — Заместитель
- Фасад в Java
- Цепочка обязанностей в Java
- кэш и remote proxy в распределённой системе — Redis в интеграции, HTTP