SpringBoot事件监听器的四种方式

Java事件监听
事件监听的概念:
事件监听就是让电脑通过你的操作得到一些数据并对这些数据做出反应,反馈相应的行为或者指令的操作。
java中的事件机制的参与者有3种角色;

  1. event object:事件状态对象,继承自java.util.EventObject,作为数用于listener的相应的方法之中。伴随事件的发生,相应的状态通常都封装在事件状态象中。
  2. event source:具体的事件源,比如说,你点击个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。
  3. event listener:对每个明确的事件的发生,都相应地定义个明确的Java方法。这些方法都集巾定义在事件监听者(EventListener)接口中,这个接口要继承java.util.EventListener。实现了事件监听者接口中一些或全部方法的类就是事件监听者,

Spring监听器
Spring的件监听是基于观察者模式。遵发布-订阅模型。
意思就是:发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。T该模型主要由四个角色组成:

  1. 事件(ApplicationEvent):继承了jdk的EventObject;spring在容器中定义了四大事件,分别对应容器启动、刷新、停止、关闭四个时刻;在spring项目中可以继承ApplicationEvent.来自定义自己的事件。
  2. 发布者(ApplicationEventPublisher):事件发布类,声明了一个用于发布事件的publishEvent()方法。ApplicationContext实现了该接口。
  3. 事件订阅者(ApplicationListener):用于接收事件,并触发事件的操作。一旦事件触发,就会执行其中的onApplicationEvent方法。
  4. 事件广播器(ApplicationEventMulticaster):用于查找事件监听器。
    功能划分:
    在Spring中通常是ApplicationContext本身担任监听器注册表的角色,在其子类
    AbstractApplicationContext中就聚合了事件广播器ApplicationEventMulticaster和事件监听器ApplicationListnener,并且提供注册监听器的addApplicationListnener方法。
    执行流程:
    当一个事件源产生事件时,它通过事件发布器ApplicationEventPublisher发布事件,然后事件广播器ApplicationEventMulticaster会大事件注册表ApplicationContext中找到事件监听器ApplicationListnener,并且逐个执行监听器的onApplicationEvent方法,从而完成事件监听器的逻辑。

SpringBoot自定义事件

Spring框架早已得供了完善的事件监听机制在Spring框架中实现事件监听的流程如下:

  1. 自定义事件,继承org.springframework.context.ApplicationEvent抽象类
package com.zuxia.event;

import org.springframework.context.ApplicationEvent;

public class CustomEvent extends ApplicationEvent {
    public CustomEvent(Object source){
        super(source);
    }
    public void printMessage(String msg){
        System.out.println("自定义事件:打印信息"+msg);
    }
}

  1. 定义事件监听器,实现org.springframework.context.ApplicationListener接口
package com.zuxia.listener;

import com.zuxia.event.CustomEvent;
import org.springframework.context.ApplicationListener;

public class CustomListener1 implements ApplicationListener<CustomEvent> {

    @Override
    public void onApplicationEvent(CustomEvent event) {
        event.printMessage("CustomListener1监听到了");
    }
}

  1. 在Spring容器中发布事件
    提供了四种实现监听的方式:
    方式一:自定义类实现ApplicationListonser接口,并且在入口主函数中使用ConfigurableApplicationContext容器装载监听
package com.zuxia;

import com.zuxia.listener.CustomListener1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringBootEventListerApplication {

    public static void main(String[] args) {
        //方法一:获取启动器的容器 加载自定义监听器
        ConfigurableApplicationContext context=SpringApplication.run(SpringBootEventListerApplication.class, args);
        context.addApplicationListener(new CustomListener1());
    }
}

方式二:自定义类实现ApplicationListenser接口,在接口上注解@Component

package com.zuxia.listener;

import com.zuxia.event.CustomEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

/**
 * 方式二:通过@Component声明这是一个需要加载的监听器
 */
@Component
public class CustomListener2 implements ApplicationListener<CustomEvent> {
    @Override
    public void onApplicationEvent(CustomEvent event) {
        event.printMessage("CustomListener2监听到了");
    }
}

方式三:白定义类不需要实现接口,在方法上标明@EventListener注解(十蓉通过
EventListenerMethodProcessor扫描出所有带有此注解的方法,然后动态构造事件监听器,并将监听器托管到Spring应用上文中)

package com.zuxia.listener;

import com.zuxia.event.CustomEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

/**
 * 方式三
 * 不需要实现AppicationListener接口
 * 但是声明当前类是@Component组件,需要被加载
 * 通过在方法上增加@EventListener注解,声明这是一个监听组件,监听的事件是方法的参数
 */
@Component
public class CustomListener3 {
    @EventListener
    public void evnetList(CustomEvent event){
        event.printMessage("CustomListener3监听到了");
    }
}

方式四:在application.properties中置context.listener.classes (DelegatingApplicationListener,该尖的作用是从application.properties中读取配置context.listener.classes,并将事件广给这些配置的监听

package com.zuxia.listener;

import com.zuxia.event.CustomEvent;
import org.springframework.context.ApplicationListener;

public class CustomListener4 implements ApplicationListener<CustomEvent> {
    @Override
    public void onApplicationEvent(CustomEvent event) {
        event.printMessage("CustomListener4执行了");
    }
}

application.yml

server:
  port: 8080

#方式四:通过配置方使加载监听器
context:
  listener:
    classes: com.zuxia.listener.CustomListener4

SpringBoot事件监听的步骤:

方法四------方法三-------方法二-------------方法一

SpringBoot事件监听机制
SpringApplicationRunListrner用于监听SpringApplication的run方法的执行。
定义了5个步照:

  1. sterting():run方法执行的时候立马执行;对应事件的类型是ApplicationStartedEvent
  2. unvirunmeniPiepared();容器创建之前并且环境信息准备好的时候调用;对应事件的类型是
    ApplicationEnvironmentPreparedEvent
  3. contextPrepared():容器创建好并初始化加载之后调用一次:对应事件的类型是
    ApplicationContextlnitializedEvent
  4. cunlexlLoaded();容器创建并加载之后并在refresh之调用;对应事件的型是ApplicalionPteparedCvenlstarted():在启动完成,回调ruuner之前调用,对事件的类型是ApplicationStartedlvent.running():启用成功启动时调用,对应事件的类型AppllcationReadyEvent 9
  5. failed().应用启动失败时调用,对应事件的类型时ApplicalionFailedEvenl

目前只有一个实现类EventPublishingRunListener,它把监听的过程过装成了SpringApplicationEvent事并通过内部属性广播出去,属性名为initialMulticaster,是ApplicationEventMulticaster接口的实现类
SimpleApplicstionEventMulticaster.广播出去的事件对象会被SpringApplication中的listeners属性进行处理

你可能感兴趣的:(#,SpringBoot,spring,boot)