最近在系统性的学习Spring Cloud方面的知识点。
强推一波:https://segmentfault.com/ls/1650000011386794
上面是大佬小马哥的教学视频。
今天的内容是学习完章节一后的课后总结
Spring的事件监听是基于标准的观察者模式的,如果在ApplicationContext部署了一个实现了ApplicationListener的bean,那么当一个ApplicationEvent发布到ApplicationContext时,这个bean得到通知并作特定的处理。
两个思考点:
1.实现了ApplicationListener的bean如何部署到ApplicationContext
2.一个ApplicationEvent如何发布到ApplicationContext
创建demo工程,导入依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
import org.springframework.context.ApplicationEvent;
public class MyEvent extends ApplicationEvent {
/*
* 可以传入任何的类型的参数,已供在监听器及他处使用
* */
public MyEvent(Object source) {
super(source);
}
}
简单的介绍查看一下ApplicationEvent源码以及Spring-boot中的实现
从图中我们可以看到我们经常使用的几个事件
ApplicationPreparedEvent
ApplicationReadyEvent
ApplicationStartingEvent
import org.springframework.context.ApplicationListener;
public class MyListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent myEvent) {
System.out.println("监听事件 : "+myEvent.toString());
System.out.println("监听事件参数 : "+myEvent.getSource().toString());
}
}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
public static void main(String[] args){
AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext();
//增加监听器
context.addApplicationListener(new MyListener());
//上下文启动
context.refresh();
//发布事件
context.publishEvent(new MyEvent("hello world"));
}
}
运行结果显示,事件正常发布与监听
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
SpringApplication.run(MyApplication.class, args);
//添加监听器
application.addListeners(new MyListener());
//获取应用上下文
ConfigurableApplicationContext context =application.run(args);
//发布事件
context.publishEvent(new MyEvent("hello world"));
context.close();
}
}
通过Component自动注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
SpringApplication.run(MyApplication.class, args);
//添加监听器
//application.addListeners(new MyListener());
//获取应用上下文
ConfigurableApplicationContext context =application.run(args);
//发布事件
context.publishEvent(new MyEvent("hello world"));
context.close();
}
}
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class MyListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent myEvent) {
System.out.println("监听事件 : "+myEvent.toString());
System.out.println("监听事件参数 : "+myEvent.getSource().toString());
}
}
其他方式不再一一讲解,小伙伴们可以了解概念后自行学习。
springboot事件监听的流程:
自定义事件,一般是继承ApplicationEvent抽象类。
定义事件监听器,一般是实现ApplicationListener接口。
配置监听器,启动的时候,需要把监听器加入到spring容器中。
发布事件。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。