イベントは実際に送信したいメッセージ本文です。これは通常、実際のビジネスに応じてカプセル化する必要があります。必要なデータの種類必要なフィールドを入力して追加します。事例を挙げてみましょう。
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; } }
リスナーは 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); } }
プッシュ イベントには、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 つのメソッドは文字列をプッシュします。
最初のメソッドを呼び出すと、コンソールはプッシュしたデータ情報を出力できます。
プッシュ文字列を呼び出すとき、インターセプターが汎用の MyApplicationEvent を追加しているため、リスナーは実行されません。つまり、MyApplicationEvent タイプのメッセージのみをリッスンします。他の種類のメッセージは受信されません。
ジェネリック医薬品を削除するとどうなるでしょうか?試してみましょう。
プッシュするたびに 2 つのメッセージが送信されます (何らかの内部メカニズムがある可能性がありますが、気にしません)。ただし、両方とも出力され、ジェネリックスが追加されていない場合は追加されないことを示します。誰が押してもメッセージはここで受け取れます。
リスナーは、上記のインターフェイスを実装して開発する以外に、アノテーションを使用して実装することもできます。具体的なコードは次のとおりです。
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 を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。