Ответ
Аннотация @Async в Spring помечает метод для асинхронного выполнения в отдельном потоке. Это позволяет не блокировать вызывающий поток во время выполнения длительных операций (запросы к БД, внешние API, обработка файлов).
Ключевые моменты:
- Метод должен быть
publicи вызываться из другого бина (чтобы работало Spring AOP проксирование). - Требуется включить поддержку асинхронности с помощью
@EnableAsyncв конфигурации. - По умолчанию используется
SimpleAsyncTaskExecutor, но можно настроить собственныйExecutor.
Пример:
@Service
public class EmailService {
@Async
public CompletableFuture<String> sendEmailAsync(String to) {
// Имитация долгой операции
Thread.sleep(2000);
return CompletableFuture.completedFuture("Email sent to " + to);
}
}
// Вызов
@Autowired
private EmailService emailService;
public void processUser() {
CompletableFuture<String> future = emailService.sendEmailAsync("user@example.com");
// Основной поток продолжает работу
future.thenAccept(result -> System.out.println(result));
}
Возвращаемые типы: void, Future<T>, CompletableFuture<T>, ListenableFuture<T>.