Назад к вопросам
СБЕР
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 не срабатывает.