Burlando @Async do Spring

王林
王林オリジナル
2024-09-12 10:21:001247ブラウズ

Burlando o @Async do Spring

Spring を使用してアプリケーションを構築する場合、@EnableAsync アノテーションを使用して非同期実行を有効にし、@Async を利用するのが一般的です。 over メソッドを使用すると、メソッドを簡単に非同期にできます。

@Async には基本的に 2 つの使用ルールがあります:

  • アノテーション付きメソッドは public である必要があります
  • メソッドの呼び出し元を同じクラスにすることはできません

以下の例では、コンパイルの問題は発生しませんが、メソッド (@Async アノテーションが付いているにもかかわらず) は期待どおりに実行されません。

@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!");
    }
}

そして、それはクラスの責任であるため、非同期で実行する必要があるコードのブロックがクラス内に残ることを望むことは非常に一般的です。解決方法は?

シンプル!

必要なのは、次のような役立つ別のクラスを作成することだけです。

@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();
    }
}

非同期実行が望ましいこの Bean の 依存性注入 を実行し、その上でメソッド プライベート を作成できます。

@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!");
    }
}

この小さな例は、制御の反転、依存関係の注入、SOLID、デザイン パターン、機能インターフェイスなどのいくつかの概念とリソースの適用を示しています。

以上がBurlando @Async do Springの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。