在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath 的监控。

二、类路径监控

首先看一些这一部分可能涉及到的类图:

在图中,红色斜线左上部分是第一部分中介绍的文件目录监控的类,其中 FileSystemWatcher 会通过独立线程监控指定的目录,当目录内容发生变化时,通过对比快照可以获得所有监控目录变化的文件ChangedFiles,然后将变化通知给实现了 FileChangeListener 监听的订阅者。
下面按照局部到整体的顺序介绍主要的类。

2.1 ClassPathFolders 类目录

这个类实现了 Iterable<File> 接口,构造方法的参数为 URL[],也就是类路径的 URL 形式。ClassPathFolders 就是简单的把 URL 转换为了 List<File> 集合,最后通过 iterator 返回迭代器。

2.2 ClassPathRestartStrategy 重启策略

接口方法根据变化的文件来决定是否需要重启。

默认提供了 PatternClassPathRestartStrategy 实现,这个实现支持 Ant 风格的模式匹配,通过设置 excludePatterns 类设置不需要重启的文件名(从类路径开始的相对路径)。不在排除范围内的文件发生变化时,就会返回 true 来引起后续的重启。

2.3 ClassPathChangedEvent 类路径变化事件

该类继承了 ApplicationEvent,事件中包含变化的文件集合以及系统是否需要重启的标志。该类在后面的 ClassPathFileChangeListener 中,会将监控目录发生变化的消息转换为 Spring 的事件,转换后就可以方便的通过 @EventListener 注解进一步解耦事件监听。

2.4 ClassPathFileChangeListener 类路径变化监听器

这个类实现了 FileChangeListener,并且会在后面的 ClassPathFileSystemWatcher 中添加到 FileSystemWatcher 的订阅列表中。

当文件变化时,就会触发下面的方法:

这里先使用前面提到过的重启策略判断此次变化是否需要重启,然后创建一个 ClassPathChangedEvent事件,通过 Spring 的 ApplicationEventPublisher 发布出去。发布事件后,所有监听 ClassPathChangedEvent 事件的监听器都会触发执行,在后续博客中会通过对该事件的监听和这里建立联系。Java架构交流学习圈:874811168 面向1-3年经验 Java开发人员 帮助突破瓶颈 提升思维能力

2.4 ClassPathFileSystemWatcher 类路径文件监控

类路径监控的实现类为 ClassPathFileSystemWatcher,先看这个类的构造方法:

创建该类时,需要提供 FileSystemWatcher 的工厂类,PatternClassPathRestartStrategy 重启策略类以及要监控的类路径 URL[]。

在构造方法中,通过工厂类获取了 fileSystemWatcher,设置了当前的重启策略,然后通过 ClassPathFolders 包装了 URL[] 数组。然后设置 fileSystemWatcher 监控这些目录(fileSystemWatcher 通过 Iterator 接口和 ClassPathFolders 解耦)。

ClassPathFileSystemWatcher 还实现了 InitializingBean 接口和 ApplicationContextAware 接口,其中 setApplicationContext 方法会在 afterPropertiesSet 方法前执行,两个方法的实现如下:

虽然这里会判断 restartStrategy,但是 devtools 默认配置时是提供该策略的,不管你是否配置了排除目录,都会提供这个策略,只有提供了这个策略,才会有 ClassPathFileChangeListener,后续监听 ClassPathChangedEvent 事件才能起作用。在所有Bean属性设置好后(afterPropertiesSet),this.fileSystemWatcher.start() 就启动了 。Java架构交流学习圈:874811168 面向1-3年经验 Java开发人员 帮助突破瓶颈 提升思维能力

此时类路径已经被监控了,后续我们需要知道 ClassPathFileSystemWatcher 是何时创建的,ClassPathChangedEvent 在何处监听的,当发生变化后,后续要怎样继续执行。

未完待续…

Spring Developer Tools 源码分析:二、类路径监控的更多相关文章

  1. Spring Developer Tools 源码分析:三、重启自动配置'

    接上文 Spring Developer Tools 源码分析:二.类路径监控,接下来看看前面提到的这些类是如何配置,如何启动的. spring-boot-devtools 使用了 Spring Bo ...

  2. 十、Spring之BeanFactory源码分析(二)

    Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...

  3. Spring IOC 容器源码分析系列文章导读

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  4. 框架-springmvc源码分析(二)

    框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...

  5. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  6. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

  7. Spring IOC 容器源码分析 - 循环依赖的解决办法

    1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...

  8. Spring IOC 容器源码分析 - 创建原始 bean 对象

    1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...

  9. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

随机推荐

  1. data日期转化

    eg: var time="2018-05-19T08:04:52.000+0000";      var d = new Date(time); var times=d.getF ...

  2. hive使用动态分区时如果动态分区的字段存在空值的问题

    hive的数据是放到hdfs中,当我们的分区字段类型为string时,如果使用动态分区向表中插入数据,而动态分区的那个字段恰好为null或者空字符串,这样hive会为其选一个默认的分区,我们查数据时分 ...

  3. OpenStack-Neutron-VPNaaS-测试和使用

    准备 确认安全组规则允许vpn协议通过(tcp协议和icmp协议,测试的时候直接设置“进出”全开) 确认两个子网上的vm可以ping通对方路由的外网ip,确认下两个vm是否可以访问外网 测试环境 (1 ...

  4. MySQL 5.6 (Win7 64位)下载、安装与配置图文教程

    一. 工具 Win7 64位操作系统 二. 步骤 第一步:下载安装包 下载 地址:http://www.mysql.com/ 截止到目前(2016/7/24) ,官网的最新版本是5.7.13,不过自己 ...

  5. Hdu2033 人见人爱A+B (贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2033 人见人爱A+B Time Limit: 2000/1000 MS (Java/Others)   ...

  6. 常用分布随机数生成及JS类函数开发和运用

    (2017-02-15 银河统计) 随机数生成是运用蒙特卡洛或统计随机模拟仿真方法的前提.本文在银河统计Web Service接口基础上,编制JS类函数生成常用分布随机数,为在网页中实现模拟仿真项目提 ...

  7. input 只能输入数字、字母、汉字等

    1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...

  8. springboot跑定时任务

    使用@Scheduled注解实现 1.在启动类上加上@EnableScheduling 开启定时任务 2.新建一个任务类,在方法上添加@Scheduled注解 @Componentpublic cla ...

  9. [C++ Primer Plus] 第5章、循环和关系表达式(二)课后习题

    1.编写一个要求用户输入两个整数的程序,将程序将计算并输出这两个整数之间(包括这两个整数)所有的整数的和.这里假设先输入较小的整数,例如如果用户输入的是2和9,则程序将指出2-9之间所有整数的和为44 ...

  10. Linux下按扇区读写块设备

    本文介绍Linux下按扇区读写块设备(示例TF卡),实际应用是在Android系统上,主要方法如下: 1.找到sdcard的挂载点,在android2.1系统下应该为/dev/block/mmcblk ...