在spring中可以创建监听器,用来监听事件。自定义的监听器要实现ApplicationListener接口,监听的事件要实现ApplicationEvent接口。主要流程包括:
- 1、自定义事件,一般要继承ApplicationEvent
- 2、启动的时候要把事件监听器加入到容器中
- 4、发布事件,要用ApplicationContext中的publishEvent进行发布事件,由于ConfigurableApplicationContext继承自ApplicationContext,所以用ConfigurableApplicationContext.publishEvent进行发布事件也是可以的。
下面演示几种监听的实例
方法一:
1、自定义一个事件类MyApplicationEvent,继承ApplicationEvent
package com.example.demo;
import org.springframework.context.ApplicationEvent;
public class MyApplicationEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
public MyApplicationEvent(Object source) {
super(source);
}
}
2、自定义监听器类MyApplicationEventListener ,实现接口ApplicationListener。
package com.example.demo;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/*自定义监听器类时,指定需要监听的事件MyApplicationEvent*/
public class MyApplicationEventListener implements ApplicationListener<MyApplicationEvent> {
/*当坚挺到MyApplicationEvent事件后,就调用onApplicationEvent方法。方法中传入的参数为要监听的事件*/
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("接收到的事件" + event.getClass());
}
}
3、把监听器加入到容器中,并发布要监听的事件
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
/*启动的时候要把事件监听器加入到容器中*/
app.addListeners(new MyApplicationEventListener());
ConfigurableApplicationContext context = app.run(args);
/*发布事件*/
context.publishEvent(new MyApplicationEvent(new Object()));
context.close();
}
}
输出结果为:
接收到的事件class com.example.demo.MyApplicationEvent
方法二:
定义监听器的时候,直接用注解@Component把监听器加入到IOC容器中,监听器运行在容器中,当监听到事件后,就调用监听方法。
监听器如下,加上了@Component注解,此时就把监听器已经注入到了容器中,当spring运行的时候就会自动启动监听。
@Component
public class MyApplicationEventListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("接收到的事件" + event.getClass());
}
}
在启动类中发布事件:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
ConfigurableApplicationContext context = app.run(args);
/*发布事件*/
context.publishEvent(new MyApplicationEvent(new Object()));
context.close();
}
}
运行启动类输出:
接收到的事件class com.example.demo.MyApplicationEvent
方法三:
在配置文件中进行配置监听器。spring启动的时候默认是默认加载application.properties配置文件的,可以在该配置文件中配置如下,当spring启动的时候会自动加载下面配置的监听器。
context.listener.classes=com.example.demo.MyApplicationEventListener
启动类中发布事件:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
ConfigurableApplicationContext context = app.run(args);
/*发布事件*/
context.publishEvent(new MyApplicationEvent(new Object()));
context.close();
}
}
运行启动类输出:
接收到的事件class com.example.demo.MyApplicationEvent
方法四:
自定义一个配置类,专门用来实现监听各种事件的方法,并用@EventListener注解标识监听方法。自定义的配置类用@Component加入到IOC中,当spring运行的时候,该配置bean中的监听方法运行在容器中进行监听。
配置类EventHandler 为:
package com.example.demo;
import org.springframework.context.event.ContextStoppedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class EventHandler {
/*如果event参数类型为Object,则能监听所有object及其子类的事件*/
@EventListener
public void event(MyApplicationEvent event) {
System.out.println("接收到的事件" + event.getClass());
}
}
启动类中发布事件:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
ConfigurableApplicationContext context = app.run(args);
/*发布事件*/
context.publishEvent(new MyApplicationEvent(new Object()));
context.close();
}
}
运行启动类输出:
接收到的事件class com.example.demo.MyApplicationEvent
另外
spring和spring boot中自带了很多事件,可以监听spring和spring boot中定义好的事件。spring中定义的事件在org.springframework.context.event包中,spring boot自定义的事件在org.springframework.boot.context.event包中。下面以监听监听停止容器的事件为例。
自定义配置类:
@Component
public class EventHandler {
@EventListener
public void eventStopIOC(ContextStoppedEvent stopEvent){
System.out.println("停止事件" + stopEvent.getClass());
}
}
启动类中停止容器:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
/*启动容器*/
ConfigurableApplicationContext context = app.run(args);
/*停止容器:当停止容器后,会触发eventStopIOC方法*/
context.stop();
}
}