当前位置: 首页 > 网络应用技术

Spring-boot-devtools的秘密重新启动!

时间:2023-03-07 11:24:06 网络应用技术

  在上面编写了AOP插件之后,我们还了解了此类Loader的重要性,因此今天我们将讨论此热部部署伪影Spring-boot-devtools的源代码,以了解它如何使用此classLoaderSave时间!还有什么?

  文章的主题如下吗?

  在了解Springboot的自动组装原理(如果您不理解的话,请阅读4YE之前写的本文?“ Springboot Automomatic Assembly Armipiple Allipiple Alligiple Alligiple”),我们直接打开Spring-Boot-devtools源代码,请找到Spring。工厂文件,

  我们通常会开发和调试,所以只看一下这个LocalDevtoolSautoconfiguration类?

  您能看到核心点是重新启动和重新加载吗?

  让我们看一下此重新启动的其余部分?

  可能是这样的主意?让我们按照源代码进行分析吗?

  有这样的方法吗?

  从名称进行分析,这两种方法应该是重点。从逻辑上讲,应该有一个守望者盯着classpath。如果发生更改,它将触发此类PathingChangedEvent事件?

  那么看看这个观察者Biao吗?

  您能在此处看到此类PathFilesystemwatcher类吗?

  在这里,我们注意到它实现了三个接口。在研究了上一篇文章之后,我们知道要看的第一步?

  ?“ 16张图片解锁春季的整体背景”

  根据类的初始化,首先查看是否存在静态相关的代码,然后查看构造函数,最后介绍此初始化方法AfterPropertiesset?

  这里没有静态方法,并且构造函数也非常简单,也就是说,要获得文件系统WatcherFactory,ClassPathResttrates和Monitoring的文件路径。然后看看Profopertiesset写的内容?

  这并不复杂。主管更改文件后,事件类PathingChangedEvent的问题

  那是开始方法吗?

  显然是要打开线程,所以让我们看一下线程中运行的内容吗?

  找到这个任务类观察者?

  可以发现它的任务始终是扫描,pollinterval默认为1,lemetperiod默认为0.4s

  这意味着每个旋转的时间为1s,中间包含0.4 s休息。其余事件是要确认在此期间没有再次更改该文件。

  如果更改它,您将回电Filechangelistener的Onchange。与我们上方的类PathFilechangelistener相对应,您将发布事件类PathingChangedEvent?

  大圆圈之后,我终于描述了此Monitor ClassFilesystemwatcher。同时,我们还必须将目光转移到该重新启动配置的第二个核心监视器上?

  如图所示,该方法的作用是重新启动重新启动

  在重新启动的过程中,包括两个步骤,第一步停止,开始的第二步

  停止部分是摧毁这些东西。这里也隐藏着许多细节。有很多相关的知识点?

  例如

  1.重新输入锁定在“尝试捕获”内部还是外部?

  2.循环中的rootContexts实际上是CopyOnwritearRaylist

  3.通过强制性OOM清除所有软/弱参考(?以及这种操作!)

  在启动过程中,可以通过创建此重新启动线程RESTARTLAUNCHER来实现。可以发现,该类的任务是找到主级,并调用完成重新启动的主要方法。

  在此过程中,涉及该类负载器。

  谨慎的合作伙伴可以发现在上面的行代码中,将其称为此类负载程序。此GetContextClassLoader()属于线程类。它可以在当前线程上下文上获取classloader。

  创建此RESTARTLAUNCHER线程时,我们已在RestartClassLoader中传递。

  重新启动时,您可以直接通过RestartClassLoader找到主方法以完成重新启动。

  显然,两个父母的任命机制被破坏了。

  这里的业务代码由RestartClassLoader加载,每个重新启动都会重新创建此RESTARTCLASSLOADER,然后加载业务代码?

  然后,重新启动的过程完成。

  我几乎忘记了,这里有一个默认的监视范围吗?

  如下所示?在默认策略中,未检测到这些路径下的文件更改

  可以通过配置修改

  通过读取源代码,我们知道Spring-Boot-Devtools通过自定义RestartClassLoader,在重新启动时将其销毁并重新创建代码以实现此快速重新启动来加载业务代码。

  其他JAR软件包由另一个classloader加载,不受影响。

  同时,您还可以看到春季事件机制的无处不在图,以及各种初始化操作以及线程,并发和锁定重新启动过程。线程,reentrantlock,copyonWritearRaylist,CountdownLatch,甚至OOM,甚至OOM可以这样使用!

  重新启动是反射调用的主要方法吗?

  本文在这里共享?

  仓库地址?(谢谢您的每一颗星星!)

  https://github.com/java4ye/springboot-demo-4ye

  作者:4岁