目录

 

一.监听器设计模式

1、事件

①声明一个股票事件的抽象类

②定义两个具体股票事件

2、监听器

①声明一个股票监听器的接口

②实现两个股票事件的监听器

 

3、广播器

①定义一个广播器的接口

②实现广播器接口

③定义一个股票的广播器

4、触发机制

①出发

②播放结果

二、SpringBoot的监听者模式

1、SpringBoot框架事件

2、获取监听器列表

3、触发机制

4、自定监听器

1、自定义事件

2、定义事件监听器

3、使用容器中发布事件


一.监听器设计模式

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 actuator监控配置_监听器

SpringBoot将监听器和事件封装了起来。

springboot actuator监控配置_ide_02

2、获取监听器列表

getApplicationListeners方法,会先查询监听器列表是否已经缓存过,如果没有,通过retrieveApplicationListeners方法取出监听器。在retrieveApplicationListeners方法中,会遍历监听器,通过supportsEvent方法取出可以可以监听当前事件的监听器,并添加至队列中去。

springboot actuator监控配置_ide_03

3、触发机制

springboot actuator监控配置_ide_04

假如当前事件是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