Rumah >Java >javaTutorial >Cara menggunakan ApplicationEvent dan ApplicationListener dalam SpringBoot

Cara menggunakan ApplicationEvent dan ApplicationListener dalam SpringBoot

PHPz
PHPzke hadapan
2023-05-13 19:46:091027semak imbas
Dalam model ini, terdapat dua kelas penting, satu adalah acara dan satu lagi adalah pendengar. Acara mesti mewarisi kelas ApplicationEvent dan pemantauan mesti melaksanakan antara muka ApplicationListener.

1. Acara Develop ApplicationEvent

Acara sebenarnya adalah badan mesej yang ingin kami hantar apa yang hendak digunakan, tambah medan yang diperlukan. Mari kita berikan kes.

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. Bangunkan pendengar

Pendengar adalah setara dengan pengguna MQ kami Apabila ada masa untuk menolaknya, kod pendengar boleh dilaksanakan. Di sini kami menetapkan jenis acara kami melalui generik.

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. Acara Push

Acara Push memerlukan penggunaan ApplicationEventPublisher. Objek ini sudah berada di dalam bekas apabila bekas Spring dimuatkan. Jadi kita boleh menyuntiknya secara langsung atau menggunakan ApplicationContext, kerana ApplicationContext sendiri mewarisi ApplicationEventPublisher. Mari sahkan melalui Pengawal.

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

Kami mentakrifkan dua kaedah tolak. Satu menolak jenis MyApplicationEvent kami, dan kaedah lain menolak rentetan.

Apabila kami memanggil kaedah pertama, konsol boleh mencetak maklumat data yang kami tolak.

Cara menggunakan ApplicationEvent dan ApplicationListener dalam SpringBoot

Apabila memanggil rentetan tekan, pendengar kami tidak akan melaksanakan Sebabnya ialah pemintas kami telah menambah MyApplicationEvent, yang bermaksud ia hanya akan mendengar jenis MyApplicationEvent mesej. Jenis mesej lain tidak akan didengari.

Apakah kesannya jika kita membuang ubat generik?

Cara menggunakan ApplicationEvent dan ApplicationListener dalam SpringBoot

Setiap tekan akan menghantar dua mesej (mungkin ada mekanisme dalaman, saya tidak kisah), tetapi kedua-duanya dicetak, menunjukkan bahawa jika generik tidak ditambah, tidak tidak kira siapa yang menolak , mesej boleh diterima di sini.

4. Melaksanakan pendengar melalui anotasi

Selain membangunkan pendengar dengan melaksanakan antara muka di atas, kami juga boleh melaksanakannya melalui anotasi adalah seperti berikut.

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

Anotasi @EventListener ditambahkan di sini untuk menyatakan bahawa ini adalah pendengar. Nama kaedah adalah sewenang-wenangnya, dan parameter dalam kaedah mewakili jenis acara yang akan dipantau.

Panggil kaedah tolak sekali lagi:

Cara menggunakan ApplicationEvent dan ApplicationListener dalam SpringBoot

Didapati data kedua-dua pendengar akan dicetak. Setiap orang harus memberi perhatian kepada ciri ini.

Atas ialah kandungan terperinci Cara menggunakan ApplicationEvent dan ApplicationListener dalam SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam