Sobes.tech
Назад к вопросам
Senior
4

Почему @Async не работает при вызове методов внутри одного класса в Spring?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

В Spring аннотация @Async работает через прокси, которые создаются вокруг бинов для перехвата вызовов методов и выполнения их асинхронно. Если метод с @Async вызывается внутри того же класса напрямую (например, this.asyncMethod()), вызов не проходит через прокси, а значит, асинхронность не срабатывает — метод вызывается синхронно.

Чтобы @Async заработал, вызов должен идти извне через прокси Spring. Например, из другого бина или через внедрение самого бина в себя:

@Component
public class MyService {
    @Async
    public void asyncMethod() {
        // асинхронная логика
    }

    public void caller() {
        asyncMethod(); // НЕ будет асинхронно
    }
}

// Правильный способ:
@Component
public class MyService {
    @Autowired
    private MyService self;

    @Async
    public void asyncMethod() { }

    public void caller() {
        self.asyncMethod(); // вызов через прокси, будет асинхронно
    }
}

Или вызвать метод из другого бина.

Таким образом, причина в том, что Spring AOP работает через прокси, а внутренние вызовы методов не проходят через прокси, поэтому @Async не срабатывает.