SpringBoot监听器

本文将介绍SpringBoot监听器作用和用法;采用监听器设计模式和SpringBoot手写监听器分别实现同一个文件上传进度条功能;如何使用SpringBoot监听器;SpringBoot监听器实现原理源码;SpringBoot线程池在监听器中的使用。(一)SpringBoot监听器作用和用法 监听器:又名事件驱动器。listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的
摘要由CSDN通过智能技术生成

本文将介绍SpringBoot监听器作用和用法;采用监听器设计模式和SpringBoot手写监听器分别实现同一个文件上传进度条功能;如何使用SpringBoot监听器;SpringBoot监听器实现原理源码;SpringBoot线程池在监听器中的使用。

(一)SpringBoot监听器作用和用法

 监听器:又名事件驱动器。listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:1、统计在线人数和在线用户2、系统启动时加载初始化信息3、统计网站访问量4、记录用户访问路径。

比如在web.xml中配置监听器:

<!-- 配置spring容器监听器 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/config/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

监听器既然又称事件驱动器,那么在监听器模型中有一些重要概念需要理解:

(1)事件对象:程序中的事件很抽象,事件存储了当前发生事情的全过程,如鼠标的单击事件onclick,接收消息事件,服务注册事件等等;

(2)事件源:这个事件产生的源头,也就是由什么东西通过什么过程产生了这么一个事件对象;

(3)事件发起者:让事件触发的对象。

(4)事件驱动器:管理事件的对象,绑定感兴趣的事件监听,当感兴趣的事件发生时触发。

举个例子:

小明和小张昨天打了一架,小明踢了小张一脚,此时刚好被路过的小红看到了并且记录了下来。

那么这个例子中打架以及打架的细节就是一个事件对象;其中小明和小张就是产生这个事件的事件源;而小红作为记录者如果小红和其他人说起这个事情,那么小红就是这个事件对象的发起者,同样小明小张甚至其他路人也都可以作为事件发起者说起它们打架的这个事情。

在上面例子中,就比较形象说明了一个监听器所具备的几个要素。

在介绍SpringBoot监听器怎么用之前,我们通过一个实现文件读写并显示进度条的功能,分别采用监听器设计模式和SpringBoot监听器,通过对比来体会SpringBoot监听器是怎么用的以及监听器各要素是怎么协作的?

(二)实现文件读写并显示进度条的功能,分别采用监听器设计模式和SpringBoot手写监听器进行实现对比理解监听器。

功能需求是:提供一个文件读写工具类,在文件读写的时候可以同时提供进度条提示的功能供使用者可选开启。

(1)采用监听器设计模式来实现,由于在文件读写方法中原本无法将所需的文件大小,当前读取大小属性返回出去,因此需要采用监听器设计模式,新建一个监听器模式接口暴露一个监听方法,然后在文件读写方法内进行监听,当触发读写方法时将所需要的的属性传递到外部的监听器实现类上,这样就完成了在外部调用文件读写方法时也可以监听获取所需属性的目标,进而计算当前进度百分比:

package com.example.springboot.myspring.springbootmyspring.utils;

/**
 * 文件读写监听器模式接口
 */
public interface IFileListener {
     void getReadSize(int fileSize, int readSize);
}
package com.example.springboot.myspring.springbootmyspring.utils;
import java.io.*;

/**
 * 文件工具类:文件读写,同时提供进度条提示的功能供使用者可选开启
 */
public class FileUtil {

   /**
    * 进行文件读写的核心类,通过可选传入一个监听器接口,将方法内部的参数传递出去
    */

    private static void doWriteFile(String inPath, String putPath,
                    IFileListener fileListener) throws IOException {
        //获取输入流
        FileInputStream fis = new FileInputStream(inPath);
        BufferedInputStream bis = new BufferedInputStream(fis);
        //定义输出流
        FileOutputStream fos = new FileOutputStream(putPath);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //定义读取缓存区
        int PAGE_SIZE = 100;
        byte[] bytes = new byte[PAGE_SIZE];
        //定义文件大小和读取量
        int fileSize = fis.available(); //501
        int readSize = 0;
        while(true){
            //如果不足一缓存冲区数据,全部读出
            if(fileSize <= PAGE_SIZE){
                byte[] b = new byte[fileSize];
                bis.read(b);
                bos.write(b);
                break;
            }else if(fileSize < readSize + PAGE_SIZE){ //如果是最后一个读取
                byte[] b = new byte[fileSize-readSize];
                bis.read(b);
                bos.write(b);
                break;
            }else{ //中间分页读取
                bis.read(bytes);
                bos.write(bytes);
                readSize += PAGE_SIZE;
            }
            //定义一个IFileListener监听器模式获取fileSize和readSize传递出去给调用者
            if(null != fileListener){
                fileListener.getReadSize(fileSize,readSize);
            }
  
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值