初探 SpringBoot DevTools 重启应用原理

本文介绍了SpringBoot DevTools的重启功能,分析了重启与重载的区别,以及DevTools的重启原理,包括文件变化触发机制和服务重启的实现过程。通过双类加载器策略,DevTools能快速重启应用,但若需要更细粒度的更新,可以考虑使用如JRebel的重载技术。
摘要由CSDN通过智能技术生成

DevTools 重启功能介绍

spring-boot-devtools会在源码路径src/main上的文件发生更改时自动重启SpringApplication。这样当我们改变一个类的时候,不需要点击编译器的重启按钮。但是重启的粒度其实还是比较大的,是重启整个Spring容器。 尤其是我们的应用内容过多或者包含着web容器的时候。当然和这个工具有类似功能的还有Jrebel,它使用的技术是重载,粒度小,但是收费。不在我们今天的讨论范围之内。

重启和重载的区别

The restart technology provided by Spring Boot works by using two classloaders. Classes that do not change (for example, those from third-party jars) are loaded into a base classloader. Classes that you are actively developing are loaded into a restart classloader.

When the application is restarted, the restart classloader is thrown away and a new one is created. This approach means that application restarts are typically much faster than “cold starts”, since the base classloader is already available and populated.

If you find that restarts are not quick enough for your applications or you encounter classloading issues, you could consider reloading technologies such as JRebel from ZeroTurnaround. These work by rewriting classes as they are loaded to make them more amenable to reloading.

首先重启的粒度是比较大的,每次启动,Spring容器会重新启动。而重载的粒度是一个类,把类通过类加载器重新加载到JVM中。

原理分析

流程总览

首先我们看一下, SpringBoot 从监听文件变化,到重新启动的序列图,一句话解释就是:首先有一个检测文件变化线程,如果检测到文件(泛指class文件)变化了,就重启服务器。
在这里插入图片描述

源码分析

SpringBoot 的 起点都是从AutoConfiguration开始的,当然DevTools也不例外

文件变化触发机制的实现

那么我们首先来看一下这个配置

@Configuration
	@ConditionalOnProperty(prefix = "spring.devtools.restart", name = "enabled", matchIfMissing = true)
	static class RestartConfiguration
			implements ApplicationListener<ClassPathChangedEvent> {
   

		private final DevToolsProperties properties;

		RestartConfiguration(DevToolsProperties properties) {
   
			this.properties = properties;
		}

		@Override
		public void onApplicationEvent(ClassPathChangedEvent event) {
   
			if (event.isRestartRequired()) {
   
				Restarter.getInstance().restart(
						new FileWatchingFailureHandler(fileSystemWatcherFactory()));
			}
		}

		@Bean
		@ConditionalOnMissingBean
		public ClassPathFileSystemWatcher classPathFileSystemWatcher() {
   
			URL[] urls = Restarter.getInstance(
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot DevTools 是 Spring Boot 的一个热部署工具,它可以帮助开发人员更快地进行开发和调试。DevTools 可以自动重启应用程序,并在代码更改时立即应用这些更改。因此,开发人员可以在不重新编译和重新启动整个应用程序的情况下快速地查看代码更改的效果。 ### 回答2: SpringBoot DevToolsSpringBoot的一个开发工具,可以帮助开发人员更方便快捷地开发应用程序,提高开发效率。它提供了一些便捷的功能,包括自动重启,自动配置和热部署等。 自动重启SpringBoot DevTools的重要功能之一。在开发应用程序时,经常需要修改代码并进行调试,然而修改完代码后需要手动重启应用程序才能生效,这会浪费不少时间。而使用SpringBoot DevTools开发工具,开发人员只需进行代码修改保存即可自动重启,从而快速查看修改后的效果。 自动配置是SpringBoot DevTools的另一个重要功能。在使用SpringBoot开发应用程序时,需要配置一些属性和参数,这些参数往往很长,而且需要经常修改。而使用SpringBoot DevTools开发工具,开发人员可以通过在代码中使用注解、配置文件等方法来自动配置应用程序,从而减少了配置的复杂度和工作量。 热部署是SpringBoot DevTools的另一个优点。当应用程序发生修改时,SpringBoot DevTools会自动更新和重新加载,不需要停止和启动整个应用程序。这样可以大大提高开发人员的效率,避免了频繁的重启和长时间的等待。 总之,SpringBoot DevTools是一个非常实用的开发工具,可以帮助开发人员更加方便、快捷地进行应用程序的开发和调试,提高开发效率。 ### 回答3: Spring Boot DevTools 是 Spring Boot 提供的一个开发工具模块,它可以大大提高开发 Spring Boot 应用的效率。它的主要功能包括自动应用程序重启、自动依赖关系更新和自动静态资源更新等。 1. 自动应用程序重启 当我们修改了应用程序的代码后,一般需要重新启动应用程序,才能看到修改的效果。但是使用 Spring Boot DevTools 后,我们只需要保存修改的代码,DevTools 就会自动监听到代码的变化,然后自动重启应用程序,这个过程是非常快的,通常只需要几秒钟就可以完成。 2. 自动依赖关系更新 Spring Boot DevTools 还可以自动监听应用程序的依赖关系变化,比如添加了一个新的依赖,或者更新了一个依赖的版本号等,DevTools 都会自动重新构建应用程序,并重启应用程序。 3. 自动静态资源更新 Spring Boot DevTools 还可以自动监听静态资源的变化,比如 HTML、CSS、JavaScript 等,DevTools 会自动刷新浏览器,以显示最新的页面效果。 除此之外,Spring Boot DevTools 还支持远程调试和热部署功能等,这些都可以极大地提高开发效率。总之,Spring Boot DevTools 是一款非常实用和方便的开发工具,可以为开发者省去很多繁琐的手动操作,让开发更加高效和愉悦。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值