Ответ
Spring-прокси — это объекты-заместители, которые Spring создаёт для поддержки сквозной функциональности (AOP), такой как транзакции, кэширование и безопасность.
Принцип работы: Когда вы вызываете метод бина, управление сначала передаётся прокси, который применяет дополнительное поведение (например, открывает транзакцию), а затем делегирует вызов целевому объекту.
Два основных типа прокси в Spring:
- JDK Dynamic Proxy (по умолчанию для бинов с интерфейсами).
- Создаётся во время выполнения на основе интерфейсов бина.
- Требует, чтобы бин реализовывал хотя бы один интерфейс.
- 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).