Beim Erstellen von Anwendungen mit Spring wird häufig die Annotation @EnableAsync verwendet, um asynchrone Ausführungen mit Hilfe von @Async zu ermöglichen Über Methoden machen sie leicht asynchron.
@Async hat grundsätzlich zwei Nutzungsregeln:
Im folgenden Beispiel wird es keine Kompilierungsprobleme geben, aber die Methode wird (obwohl sie mit @Async annotiert ist) nicht wie gewünscht ausgeführt.
@Slf4j @Service @RequiredArgsConstructor public class HelloService { public String get() { log.info("Chegou!"); print(); return "Ola!"; } @Async @SneakyThrows public void print() { Thread.sleep(Duration.ofSeconds(5)); log.info("Burlado!"); } }
Und es kommt sehr häufig vor, dass wir uns wünschen, dass der Codeblock, der asynchron ausgeführt werden muss, in der Klasse verbleibt, da dies in der Verantwortung der Klasse liegt. Wie löst man es?
Einfach!
Wir müssen nur eine weitere Klasse erstellen, die hilft, zum Beispiel:
@Service public class AsyncService { @Async public void run(final Runnable runnable) { runnable.run(); } @Async public <O> O run(final Supplier<O> supplier) { return supplier.get(); } }
Wir führen eine Abhängigkeitsinjektion dieser Bean durch, wenn eine asynchrone Ausführung wünschenswert ist, und darüber hinaus können wir die Methode privat machen.
@Slf4j @Service @RequiredArgsConstructor public class HelloService { private final AsyncService asyncService; public String get() { log.info("Chegou!"); asyncService.run(this::print); return "Ola!"; } @SneakyThrows private void print() { Thread.sleep(Duration.ofSeconds(5)); log.info("Burlado!"); } }
Dieses kleine Beispiel demonstriert die Anwendung mehrerer Konzepte und Ressourcen: Inversion of Control, Dependency Injection, SOLID, Design Pattern, Functional Interfaces.
Das obige ist der detaillierte Inhalt vonBurlando oder @Async für Spring. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!