SpringBoot的事件监听
SpringBoot项目在run的时候就会有事件监听,一个类被装配到spring容器的时候或者被操作的时候都会有事件的监听。
有的时候我不想把这个类装配到spring容器的话,它也会实现事件的监听,这个时候会用到自定义的事件监听。
比如这个类创建好之后我要进行一个监听,或者这个类创建好之后要给下一个类的通知这样的情况下也需要监听,有点类似于Servlet中的监听器。
自定义监听的实现过程:
只要有四个步骤:1>自定义事件一般是继承ApplicationEvent抽象类:交给父类去初始化。
package com.boot.event.demo.bootevent;
import org.springframework.context.ApplicationEvent;
public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(Object source) {
super(source);
}
}
2>自定义事件监听器,一般实现ApplicationListener接口
package com.boot.event.demo.bootevent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class MyApplicationListener implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
System.out.println("接收到了事件监听"+applicationEvent.getClass());
}
}
3>当我们创建一个对象的时候要触发这个事件的话,要把这个事件传下去的时候,所以要把这个事件添加到spring容器中去。
package com.boot.event.demo.bootevent;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class BootEventApplication {
public static void main(String[] args) {
SpringApplication app=new SpringApplication(BootEventApplication.class);
//添加监听事件
app.addListeners(new MyApplicationListener());
ConfigurableApplicationContext context = app.run(args);
context.close();
}
}
运行的结果如下:这时只是触发了springBoot项目中自己的事件,
为什么能够触发这么多事件呢?因为下面的所有的事件输出都是ApplicationEvent的事件。而刚刚自己定义的事件没有触发
解决办法:改下自己的事件监听,加上一个泛型的约束。
package com.boot.event.demo.bootevent;
import org.springframework.context.ApplicationListener;
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent myApplicationEvent) {
System.out.println("接收到了事件监听"+myApplicationEvent.getClass());
}
}
3>发布事件:通过容器来发布事件:相当于把这个事件注册容器中才行。
如果不发布的话,它只能发布自己原有的事件。
配置监听器方式:第一种方式:添加事件:addListener:
自己的事件的发布的代码如下:
运行的结果如下:
而且在监听的过程中还可以得到哪一个事件源触发的代码如下:
package com.boot.event.demo.bootevent;
import org.springframework.context.ApplicationListener;
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent myApplicationEvent) {
System.out.println("接收到了事件监听"+myApplicationEvent.getClass());
System.out.println("事件源"+myApplicationEvent.getSource());
}
}
运行的结果如下:
配置监听器方式:第二种方式:把监听器Listener对象交给Spring容器管理
再次运行的话:
3>使用配置项配置context.listener.classes=监听器全路径
运行的结果如下:
4>使用@EventListener注解(用的比较多)
4.1、新建一个类:处理事件的类,代码如下:
package com.boot.event.demo.bootevent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class HandlerEvent {
@EventListener
public void HandlerEvent(MyApplicationEvent event){
System.out.println("接收到了事件监听"+event.getClass());
System.out.println("事件源"+event.getSource());
}
运行下:
在这个自己定义的处理事件的类里面可以很多个处理的事件的方法:代码如下:
package com.boot.event.demo.bootevent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class HandlerEvent {
@EventListener(MyApplicationEvent.class)
public void HandlerEvent(MyApplicationEvent event){
System.out.println("接收到了事件监听"+event.getClass());
System.out.println("事件源"+event.getSource());
}
@EventListener()
public void HandlerEvent(Object event){
System.out.println("接收到了事件监听"+event.getClass());
}
}
运行的结果如下:
总结:比如这个功能可以用来做当这个对象创建好之后还想做一些额外的操作或者想触发一个事件去通知下一个对象才能够操作的话可以用SpringBoot的事件监听。事件就是驱动,必须由spring的容器来发布,别的容器发不了里面用的就是一种广播的方式来做的。