概述
Spring框架提供了完善的事件监听机制,在Spring框架中实现事件监听的步骤如下:
- 自定义事件,继承org.springframework.context.ApplicationEvent抽象类
- 定义事件监听器,实现org.springframework.context.ApplicationListener接口
- 在Spring容器中发布事件
在Spring框架中提供了以下三种事件监听的方式:
- 编程式:通过实现ApplicationListener接口来监听指定类型的事件
- 注解式:通过在方法上加@EventListener注解的方式监听指定参数类型的事件,写该类需要托管到Spring容器中
- 配置式:通过application.properties中配置context.listener.classes属性指定监听器
org.springframework.boot
spring-boot-starter-web
编程式
基础
第一步:自定义事件(模拟邮件发送):
public class EmailEvent extends ApplicationEvent {
public EmailEvent(Object source) {
super(source);
}
}
第二步:自定义事件监听器:
@Component
public class EmailEventListener implements ApplicationListener {
@Override
public void onApplicationEvent(EmailEvent event) {//参数表示监听的事件的类型
System.out.printf("监听到事件 %s :开始-%s \n"
,event.getClass().getName(),event.getSource());
}
}
第三步:创建Controller:
@RestController
public class DemoController {
@Resource
private ApplicationContext act;
//发布事件
@RequestMapping("/pubEvnet")
public void pubEvnet() {
//TODO:业务处理
System.out.println("发布事件");
act.publishEvent(new EmailEvent("发送邮件"));
//TODO:业务处理
}
}
部署项目,网页访问,控制台查看到结果:
改进一第二步自定义事件监听器类的注解@Component可以省略,然后在项目启动类中手动添加注解就可以了,修改后的启动类代码如下:
@SpringBootApplication
public class EventDemoApplication{//对应com.hc.demo1包
public static void main(String[] args) {
ConfigurableApplicationContext cat =
SpringApplication.run(EventDemoApplication.class, args);
cat.addApplicationListener(new EmailEventListener1());//手动添加监听
}
}
改进二:
第二步自定义事件监听器类可以不用实现ApplicationListener接口,通过添加注解@EventListener指定监听方法以及参数类型的事件,写该类需要托管到Spring容器中。
@Component
public class EmailEventListener2 { //不需要继承任何接口
@EventListener
public void onApplicationEvent(EmailEvent2 event) {//参数表示监听的事件的类型
System.out.printf("监听到 %s : 事件-%s", event.getClass().getName(), event.getSource());
}
}
然后使用默认的系统启动类就可以了。
配置式所谓的配置方式指的是在application.yml文件中配置context.listener.classes属性指定事件监听器,示例代码如下:
context:
listener:
classes: com.hc.demo3.EmailEventListener3