@Async на методе своего же класса — вызов проходит мимо proxy

Spring оборачивает бин в proxy для @Async, @Transactional, @Cacheable — но proxy перехватывает только внешние вызовы через интерфейс или CGLIB-наследование. Вызов метода внутри того же класса идёт напрямую, минуя proxy.

Аннотация при этом не выдаёт ошибку и не пишет предупреждение в лог — метод просто выполняется синхронно, в том же потоке, что и вызывающий код. На проде это заметят по времени отклика, на тестах — часто нет, потому что синхронное поведение иногда даже совпадает с ожиданием теста.

@Service public class ReportService {

public void generate() { exportAsync(); }

@Async public void exportAsync() { // выполняется синхронно } }

Спросят про способ исправить: вынести метод в отдельный бин и вызывать через внедрённую зависимость, либо получить self-proxy через AopContext.currentProxy() с exposeProxy = true.

Аннотация на методе — не гарантия, что она сработает. Гарантия — это то, как этот метод вызван.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки