IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot事件监听器的四种方式 -> 正文阅读

[Java知识库]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属性进行处理

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:20:41  更:2021-10-23 12:22:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/27 0:30:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码