目录
一.监听器设计模式
1、事件
①声明一个股票事件的抽象类
public abstract class StockEvent {
public abstract String doWith();
}
②定义两个具体股票事件
public class DownEvent extends StockEvent {
@Override
public String doWith() {
return "下跌";
}
}
public class RiseStockEvent extends StockEvent {
@Override
public String doWith() {
return "上涨";
}
}
2、监听器
①声明一个股票监听器的接口
public interface StockListenter {
void stockEvent(StockEvent stockEvent);
}
②实现两个股票事件的监听器
public class DownStockListenter implements StockListenter {
@Override
public void stockEvent(StockEvent stockEvent) {
if (stockEvent instanceof DownEvent) {
System.out.println(stockEvent.doWith());
}
}
}
public class RiseStockListenter implements StockListenter {
@Override
public void stockEvent(StockEvent stockEvent) {
if (stockEvent instanceof RiseStockEvent) {
System.out.println(stockEvent.doWith());
}
}
}
3、广播器
①定义一个广播器的接口
public interface EventBroadcaster {
//广播事件
void broadcastEvent(StockEvent stockEvent);
//添加事件
void addListenter(StockListenter listenter);
//删除事件
void removeListenter(StockListenter listenter);
}
②实现广播器接口
public abstract class AbstractEventBroadcaster implements EventBroadcaster {
private List<StockListenter> listenterList = new ArrayList<>();
@Override
public void broadcastEvent(StockEvent stockEvent) {
//开始广播
start();
//遍历监听器播放监听事件
for (StockListenter stockListenter : listenterList) {
stockListenter.stockEvent(stockEvent);
}
//结束广播
end();
}
@Override
public void addListenter(StockListenter listenter) {
listenterList.add(listenter);
}
@Override
public void removeListenter(StockListenter listenter) {
listenterList.remove(listenter);
}
abstract void start();
abstract void end();
}
③定义一个股票的广播器
public class StockEventBroadcaster extends AbstractEventBroadcaster {
@Override
void start() {
System.out.println("开始广播");
}
@Override
void end() {
System.out.println("广播结束");
}
}
4、触发机制
①出发
public class Test {
public static void main(String[] args) {
//定义一个广播器
StockEventBroadcaster stockEventBroadcaster = new StockEventBroadcaster();
//定义两个监听器r
RiseStockListenter riseStockListenter = new RiseStockListenter();
DownStockListenter downStockListenter = new DownStockListenter();
//将监听器放入广播器
stockEventBroadcaster.addListenter(riseStockListenter);
stockEventBroadcaster.addListenter(downStockListenter);
//广播两个事件
stockEventBroadcaster.broadcastEvent(new DownEvent());
stockEventBroadcaster.broadcastEvent(new RiseStockEvent());
}
}
②播放结果
开始广播
下跌
广播结束
开始广播
上涨
广播结束
二、SpringBoot的监听者模式
1、SpringBoot框架事件
SpringBoot框架事件
SpringBoot将监听器和事件封装了起来。
2、获取监听器列表
getApplicationListeners方法,会先查询监听器列表是否已经缓存过,如果没有,通过retrieveApplicationListeners方法取出监听器。在retrieveApplicationListeners方法中,会遍历监听器,通过supportsEvent方法取出可以可以监听当前事件的监听器,并添加至队列中去。
3、触发机制
假如当前事件是Starting,遍历监听器,每个监听器首先判断是否实现了SmartApplicationListener接口
如果实现,就比对当前Starting事件是否为该监听器supportsEventType中可以监听的事件。
如果没有实现,也是比对该监听器是否可以监听Starting事件。
4、自定监听器
①实现ApplicationListener接口,只不过监听事件则恒定为ApplicationStartedEvent
②实现SmartApplicationListener接口,可以通过supportsEventType,来自定义监听事件。
③注册方法与系统初始化器一样
Spring框架中实现监听事件的流程:
(1)自定义事件,继承ApplicationEvent抽象类
(2)定义事件监听器,实现ApplicationListener接口
(3)使用容器中发布事件
示例一
1、自定义事件
public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(Object source) {
super(source);
}
}
2、定义事件监听器
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("接受到了事件:"+event.getClass());
System.out.println("接受到了事件:"+event.getSource());
}
}
3、使用容器中发布事件
1.在启动类中发布事件
@SpringBootApplication
public class EventDemoApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(EventDemoApplication.class);
//1 添加监听事件
app.addListeners(new MyApplicationListener());
ConfigurableApplicationContext context = app.run(args);
// 发布事件
context.publishEvent(new MyApplicationEvent(new Object()));
context.close();
}
}
控制台输出:
接受到了事件:class com.boot.event.eventdemo.MyApplicationEvent
接受到了事件:java.lang.Object@f713686
2. 注解式,最常用
1、自定义事件
public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(Object source) {
super(source);
}
}
2、@EventListener注解的方式监听
@Component
public class HandlerEvent {
@EventListener(MyApplicationEvent.class)
public void handlerEvent(MyApplicationEvent event) {
System.out.println("接受到了事件====:"+event.getClass());
System.out.println("接受到了事件====:"+event.getSource());
}
}
3、使用容器中发布事件
@SpringBootApplication
public class EventDemoApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(EventDemoApplication.class);
ConfigurableApplicationContext context = app.run(args);
// 发布事件
context.publishEvent(new MyApplicationEvent(new Object()));
context.close();
}
}
控制台输出:
接受到了事件====:class com.boot.event.eventdemo.MyApplicationEvent
接受到了事件====:java.lang.Object@352c308
3. 配置文件
1、自定义事件
public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(Object source) {
super(source);
}
}
2、定义事件监听器
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println("接受到了事件:"+event.getClass());
System.out.println("接受到了事件:"+event.getSource());
}
}
3、使用容器中发布事件
@SpringBootApplication
public class EventDemoApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(EventDemoApplication.class);
ConfigurableApplicationContext context = app.run(args);
// 发布事件
context.publishEvent(new MyApplicationEvent(new Object()));
context.close();
}
}
4、application.properties中配置
context.listener.classes=com.boot.event.eventdemo.MyApplicationListener
5、控制台输出
接受到了事件:class com.boot.event.eventdemo.MyApplicationEvent
接受到了事件:java.lang.Object@3a0807b7