Sobes.tech
Back to questions
Senior
6

Как влияет final класс на работу @Transactional?

Companies where asked
EXPERA

Answer from AI

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 прокси не создастся, и транзакции не будут работать.