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

接上文 Spring Developer Tools 源码分析:二、类路径监控,接下来看看前面提到的这些类是如何配置,如何启动的。

spring-boot-devtools 使用了 Spring Boot 的自动配置方式,我们先关注本地开发环境中自动重启的部分。

在 LocalDevToolsAutoConfiguration 主要包含了 LiveReload 和重启的配置,LiveReload 后续看情况再介绍,这里先看重启的配置。

3.1 LocalDevToolsAutoConfiguration 本地配置

在这个类上@ConditionalOnInitializedRestarter是一个该配置生效的条件,具体实现中会判断 Restarter 是否已经实例化,并且是否存在可被监控的类目录(除 jar 文件外的目录),如果已经实例化,并且有需要监控的目录才会启动。

通过 java -jar 方式启动的时候,由于不存在需要监控的目录,devtools 不会触发后续的配置,因此虽然启动了 Restarter,但是并不会监控目录,也不会自动重启。

当通过 IDE 启动项目时,默认情况下会满足这里的条件,LocalDevToolsAutoConfiguration 中的其他配置可以生效。

3.2 RestartConfiguration 重启配置

在 RestartConfiguration 上也有限制条件,只有当设置下面的参数时才不会生效

不设置或者设置为任何不是 false (忽略大小写)的值时,都会生效。

除了这个参数能控制外,还有一个可以直接控制 Restarter 是否生效的参数,后续会介绍。

下面逐个看 RestartConfiguration 中的各个配置。

3.2.1 FileSystemWatcherFactory 文件监控

配置代码如下:

FileSystemWatcherFactory 是一个函数式接口,这里直接返回了一个方法引用。将来调用该接口的方法时,就会执行下面的 newFileSystemWatcher 方法。

每次调用 fileSystemWatcherFactory() 方法时,返回的都是同一个 FileSystemWatcherFactory,但是调用工厂的 getFileSystemWatcher() 方法时返回都是新的 FileSystemWatcher。

通过这个方法可以看到创建 FileSystemWatcher 时,这里会判断是否配置了触发文件(只有修改指定文件才会重启),是否配置额外需要监控变化的位置。Java架构交流学习圈:874811168 面向1-3年经验 Java开发人员 帮助突破瓶颈 提升思维能力

3.2.2 ClassPathRestartStrategy 重启策略

代码如下:

该方法返回了 PatternClassPathRestartStrategy 实现类,判断是否重启时,忽略所有传入的位置,默认忽略的位置如下:

额外的排除项可以通过下面的参数设置:

3.2.3 ClassPathFileSystemWatcher 类路径监控

代码如下:

这里创建时,从 Restarter 获取了需要监控的类路径(后续会详细介绍),然后创建了一个 watcher,使用了前面创建的两个 bean。setStopWatcherOnRestart 的意思是当类路径发生变化并且需要重启时,是否停止类监控,这里设置了 true,也就是重启前会停止监控。

如果重启前会停止监控,我们可能需要担心如果配置改错了导致 Spring 无法启动该怎么办,devtools 也提供了相应的策略来解决这个问题,下一小节就会看到。

3.2.3 监听 ClassPathChangedEvent

代码如下:

当一个方法添加 @EventListener 时,Spring 会把该方法添加到事件监听中,当触发该事件时,这个方法就会被调用。在上一篇介绍了 ClassPathChangedEvent,其中包含了 restartRequired,这里会判断是否需要重启,当需要重启时,就会调用 Restarter 的实例进行重启。

在重启方法中还传入了 FileWatchingFailureHandler 并且使用了 fileSystemWatcherFactory

FileWatchingFailureHandler 实现了 FailureHandler 接口,该接口用于在重启的启动过程中,如果出错了,要采取什么策略去进行下去,该接口方法返回的结果只有两种,Outcome.ABORT 中止或 Outcome.RETRY 重试。

FileWatchingFailureHandler 中会通过 fileSystemWatcherFactory 创建一个新的文件监控,当类路径的内容发生变化时(不需要考虑是否需要重启,因为已经停止,并且没启动成功)就尝试重新启动。这种策略可以解决当配置或者代码出错无法启动时,可以修改BUG解决错误,然后 devtools 自动尝试启动。

FileWatchingFailureHandler 中的 FileSystemWatcher 和 3.2.3 中的不是同一个,并且在重启前另一个已经关闭,关闭的目的不是为了防止和这里存在两个监控出现冲突,而是为了防止第一次修改后,还没有重启时又发生了变化,由于重启需要时间,这就会导致重启还没完成就又重启了,这种情况下除了会产生错误外,还会因为短时间内频繁重启导致重启时间过长。Java架构交流学习圈:874811168 面向1-3年经验 Java开发人员 帮助突破瓶颈 提升思维能力

在重启时,会先关闭所有的 Spring Context,此时也会触发 ClassPathFileSystemWatcher 中的 destroy 方法:

在 destroy 中也会关闭文件监控,所以无论如何都不会和这里的 FileSystemWatcher 产生冲突。

3.3 重启后会重新初始化 Spring

关闭再启动时,devtools 通过反射执行的我们自己的 XXApplication 类的 main 方法,因此 LocalDevToolsAutoConfiguration 也会重新初始化,类路径监控也会重新建立。我们现在只是了解了从文件监控、类路径监控以及监控配置启动和触发重启的过程。有很多关键的处理过程和 RestartClassLoader 以及 Restarter 有关,为了防止过长篇幅使得关注点太过分散,后续会分别介绍这两部分内容。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容