ApplicationEvent-Spring的事件使用

1、Spring事件使用思路

Spring的事件为Bean与Bean之间的消息通信提供了支持,当一个Bean处理完一个任务之后,希望另外一个Bean知道并能做相应的处理,这时我们就需要让一个Bean监听当前Bean所发送的事件。

Spring的事件需要遵循如下流程:

  1. 自定义事件,集成ApplicationEvent。
  2. 定义事件监听器,实现ApplicationListener。
  3. 使用容器发布事件。

2、ApplicationEvent事件的使用

2.1 自定义事件
实现ApplicationEvent接口

import org.springframework.context.ApplicationEvent;

public class MyFirstEvent extends ApplicationEvent {
    
    

    private static final long serialVersionUID = 1L;

    private String msg;
	//构造函数 
    public MyFirstEvent(Object source, String msg) {
    
    
        super(source);
        this.msg = msg;
    }

    public String getMsg() {
    
    
        return msg;
    }

    public void setMsg(String msg) {
    
    
        this.msg = msg;
    }
}

2.2 定义事件监听器
实现ApplicationListener接口
注意1:需要将事件的监听器加入到IOC容器中,交由Spring管理(使用@Component注解)。
注意2:因为传入的事件类是:MyFirstEvent,故该事件监听器只负责监听:MyFirstEvent类型的事件,其他事件不管
注意3:如果泛型参数为ApplicationEvent ,则表示监听所有类型的事件。

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyFirstEventListener implements ApplicationListener<MyFirstEvent> {
    
    

    @Override
    public void onApplicationEvent(MyFirstEvent myFirstEvent) {
    
    
        String msg = myFirstEvent.getMsg();
        System.out.println("事件监听者接收到的消息为:"+msg);
    }

}

2.3 定义事件发布者
使用ApplicationContext 进行事件的发布

import com.yuyufeng.springbootmybatisdynamic.event.MyFirstEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/my_first_listener")
public class MyFirstListenerController {
    
    

    //通过依赖注入,注入ApplicationContext:IOC容器
    @Autowired
    private ApplicationContext applicationContext;


    @GetMapping("/test/{msg}")
    public void test1(@PathVariable("msg") String msg){
    
    
        System.out.println("事件发布者发布消息:"+msg);
        //用IOC容器来发布事件
        applicationContext.publishEvent(new MyFirstEvent(this,msg));
    }

}

2.4 效果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43911286/article/details/112692327