Spring @Async com CompletableFuture

Tenho uma dúvida sobre este código:

@Async
public CompletableFuture<String> doFoo() {
    CompletableFuture<String> fooFuture = new CompletableFuture<>();  

    try {
        String fooResult = longOp();
        fooFuture.complete(fooResult);
    } catch (Exception e) {
        fooFuture.completeExceptionally(e);
    }

    return fooFuture;
}

A pergunta é: o doFoo retorna o fooFuture somente depois que o longOp terminou (corretamente ou excepcionalmente) e, portanto, está retornando futuros já concluídos ou o Spring está fazendo alguma mágica e retornando antes de executar o corpo? Se o código estiver bloqueando em longOp (), como você expressaria que a computação está sendo alimentada a um executor?

Talvez isso? Qualquer outra maneira?

@Async
public CompletableFuture<String> doFoo() {

    CompletableFuture<String> completableFuture = new CompletableFuture<>();
    CompletableFuture.runAsync(() -> {
        try {
            String fooResult = longOp();
            completableFuture.complete(fooResult);
        } catch (Exception e) {
            completableFuture.completeExceptionally(e);
        }
    });
    return completableFuture;
}

questionAnswers(1)

yourAnswerToTheQuestion