ホームページ >Java >&#&チュートリアル >SpringBoot で ApplicationEvent と ApplicationListener を使用する方法

SpringBoot で ApplicationEvent と ApplicationListener を使用する方法

PHPz
PHPz転載
2023-05-13 19:46:091027ブラウズ
このモデルには 2 つの重要なクラスがあり、1 つはイベント、もう 1 つはリスニングです。イベントは ApplicationEvent クラスを継承する必要があり、モニタリングは ApplicationListener インターフェイスを実装する必要があります。

1. ApplicationEvent イベントの開発

イベントは実際に送信したいメッセージ本文です。これは通常、実際のビジネスに応じてカプセル化する必要があります。必要なデータの種類必要なフィールドを入力して追加します。事例を挙げてみましょう。

package com.lsqingfeng.springboot.applicationEvent;
 
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;
 
/**
 * @className: MyApplicationEvent
 * @description: 事件封装
 * @author: sh.Liu
 * @date: 2022-03-23 14:41
 */
@Getter
@Setter
@ToString
public class MyApplicationEvent extends ApplicationEvent {
 
    private Integer age;
 
    private String name;
 
    /**
     * 需要重写构造方法
     * @param source
     * @param name
     * @param age
     */
    public MyApplicationEvent(Object source, String name, Integer age) {
        super(source);
        this.name = name;
        this.age = age;
    }
}

2. リスナーの開発

リスナーは MQ のコンシューマーに相当し、プッシュする時間があれば、リスナー コードを実行できます。ここでは、ジェネリックを使用してイベント タイプを設定します。

package com.lsqingfeng.springboot.applicationEvent;
 
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
 
/**
 * @className: MyApplicationEventListener
 * @description:事件监听器
 * @author: sh.Liu
 * @date: 2022-03-23 14:50
 */
@Component
public class MyApplicationEventListener implements ApplicationListener<MyApplicationEvent> {
 
    @Override
    public void onApplicationEvent(MyApplicationEvent event) {
        System.out.println("收到消息:" + event);
    }
}

3. プッシュ イベント

プッシュ イベントには、ApplicationEventPublisher を使用する必要があります。このオブジェクトは、Spring コンテナがロードされたときにすでにコンテナ内にあります。したがって、ApplicationContext 自体は ApplicationEventPublisher を継承するため、これを直接注入することも、ApplicationContext を使用することもできます。コントローラーを介して確認してみましょう。

package com.lsqingfeng.springboot.controller;
 
import com.lsqingfeng.springboot.applicationEvent.MyApplicationEvent;
import com.lsqingfeng.springboot.base.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @className: ApplicationEventController
 * @description:
 * @author: sh.Liu
 * @date: 2022-03-23 15:21
 */
@RestController
@RequestMapping("event")
public class ApplicationEventController {
 
    @Autowired
    private ApplicationContext applicationContext;
 
    @RequestMapping("/push")
    public Result pushEvent(){
        MyApplicationEvent myApplicationEvent = new MyApplicationEvent(this,"zhangsan", 10);
        applicationContext.publishEvent(myApplicationEvent);
        return Result.success();
    }
 
    @RequestMapping("/push3")
    public Result pushEvent2(){
        applicationContext.publishEvent("大家好");
        return Result.success();
    }
}

2 つのプッシュ メソッドを定義します。 1 つは MyApplicationEvent タイプをプッシュし、もう 1 つのメソッドは文字列をプッシュします。

最初のメソッドを呼び出すと、コンソールはプッシュしたデータ情報を出力できます。

SpringBoot で ApplicationEvent と ApplicationListener を使用する方法

プッシュ文字列を呼び出すとき、インターセプターが汎用の MyApplicationEvent を追加しているため、リスナーは実行されません。つまり、MyApplicationEvent タイプのメッセージのみをリッスンします。他の種類のメッセージは受信されません。

ジェネリック医薬品を削除するとどうなるでしょうか?試してみましょう。

SpringBoot で ApplicationEvent と ApplicationListener を使用する方法

プッシュするたびに 2 つのメッセージが送信されます (何らかの内部メカニズムがある可能性がありますが、気にしません)。ただし、両方とも出力され、ジェネリックスが追加されていない場合は追加されないことを示します。誰が押してもメッセージはここで受け取れます。

4. アノテーションを使用したリスナーの実装

リスナーは、上記のインターフェイスを実装して開発する以外に、アノテーションを使用して実装することもできます。具体的なコードは次のとおりです。

package com.lsqingfeng.springboot.applicationEvent;
 
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
 
/**
 * @className: MyApplicationEventListener2
 * @description: 注解实现监听器
 * @author: sh.Liu
 * @date: 2022-03-23 15:56
 */
@Component
public class MyApplicationEventListener2 {
 
    @EventListener
    public void onEvent(MyApplicationEvent event){
        System.out.println("收到消息2:" + event);
    }
}

これがリスナーであることを表すために、@EventListener アノテーションがここに追加されます。メソッド名は任意であり、メソッド内のパラメータは監視するイベントの種類を表します。

push メソッドを再度呼び出します。

SpringBoot で ApplicationEvent と ApplicationListener を使用する方法

両方のリスナーのデータが出力されることがわかります。誰もがこの機能に注目する必要があります。

以上がSpringBoot で ApplicationEvent と ApplicationListener を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。