Перейти к основному содержимому

Паттерн "Заместитель" (Proxy) в Java — доступ, кэш и lazy loading

Разработчику Архитектору
Теория данных (раздел 3)

Обзор — в структурных паттернах. Здесь — 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

ProxyDecorator
ФокусКонтроль доступа и жизненного циклаДобавление поведения
КлиентМожет не знать о существовании real subjectОжидает цепочку обёрток
ПримерLazy load, securitynew BufferedInputStream(new FileInputStream(...))

Когда применять и риски

Прокси уместен, когда нужен прозрачный контроль без изменения клиентского кода.

Несколько слоёв прокси (AOP + security + cache) усложняют отладку и добавляют задержку — логируйте цепочку перехватчиков в dev-среде.


См. также