Назад к вопросам
СБЕР
Senior
5
Что произойдёт если вызвать @Async метод из не-аннотированного метода внутри одного бина?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Если вызвать метод, аннотированный @Async, из другого метода того же бина, который не аннотирован, то асинхронность не сработает.
Причина в том, что Spring использует прокси для реализации @Async. При вызове метода внутри того же класса вызов происходит напрямую, минуя прокси, и аннотация игнорируется.
В результате метод выполнится синхронно в том же потоке.
Чтобы @Async сработал, вызов должен идти извне через прокси, например, из другого бина или через ApplicationContext.
Пример:
@Component
public class MyService {
@Async
public void asyncMethod() {
// выполняется асинхронно
}
public void syncMethod() {
asyncMethod(); // вызов внутри класса — будет синхронно
}
}
Чтобы исправить, можно:
- Вынести
asyncMethodв другой бин и вызывать его оттуда. - Использовать
ApplicationContextдля получения прокси и вызвать метод через него. - Или использовать
@EnableAsync(proxyTargetClass=true)и CGLIB прокси, но вызов внутри класса всё равно не проксируется.