Назад к вопросам
Senior
5
Как влияет final класс на работу @Transactional?
Компании, где спрашивали
EXPERA
Ответ от нейросети
sobes.tech AI
Аннотация @Transactional в Spring обычно реализуется через прокси, которые перехватывают вызовы методов для управления транзакциями.
Если класс объявлен как final, то Spring не сможет создать прокси на основе наследования (CGLIB), так как наследование от final класса невозможно. В этом случае:
- Если используется JDK динамический прокси (по интерфейсам), то
finalкласс не мешает, так как прокси создаётся на основе интерфейса. - Если используется прокси на основе класса (CGLIB), то
finalкласс не может быть проксирован, и@Transactionalне сработает.
Таким образом, final класс может помешать работе @Transactional, если прокси создаётся через наследование (CGLIB). Чтобы избежать проблем, либо не делать класс final, либо использовать интерфейсы для проксирования.
Пример:
@Service
@Transactional
public final class MyService {
public void doWork() { /* ... */ }
}
// В этом случае CGLIB прокси не создастся, и транзакции не будут работать.