Что такое прокси в Spring и как они работают?

«Что такое прокси в Spring и как они работают?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring-прокси — это объекты-заместители, которые Spring создаёт для поддержки сквозной функциональности (AOP), такой как транзакции, кэширование и безопасность.

Принцип работы: Когда вы вызываете метод бина, управление сначала передаётся прокси, который применяет дополнительное поведение (например, открывает транзакцию), а затем делегирует вызов целевому объекту.

Два основных типа прокси в Spring:

  1. JDK Dynamic Proxy (по умолчанию для бинов с интерфейсами).
    • Создаётся во время выполнения на основе интерфейсов бина.
    • Требует, чтобы бин реализовывал хотя бы один интерфейс.
  2. CGLIB Proxy (используется, если интерфейсов нет или задано proxyTargetClass=true).
    • Создаёт прокси через наследование от класса бина.
    • Не работает для final классов и методов.

Пример с транзакционным прокси:

@Service
public class UserService {
    @Transactional // Spring создаст прокси для управления транзакцией
    public User createUser(String name) {
        // Логика сохранения в БД
        return userRepository.save(new User(name));
    }
}

Важные нюансы:

  • Самовызов (this.createUser()) внутри класса не проходит через прокси, так как вызывается метод напрямую, а не у прокси-объекта. Для обхода используют инъекцию самого бина (@Autowired private UserService self) или AopContext.currentProxy().
  • Проверить, является ли объект прокси: AopUtils.isAopProxy(bean).