Как работает аннотация @Async в Spring?

«Как работает аннотация @Async в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Аннотация @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>.