SpringBoot2.x系列教程05--SpringBoot花样配置之实现热部署配置及原理

简介: 前言上一章节中,壹哥 带各位学会了配置自定义的Web端口与项目根目录,今天我们再来看看其他的一些小花样。在开发阶段,我们编写完代码后,就得需要点击启动按钮,重启项目后才能看到更新后的内容,每次都这么操作,就会就得有点麻烦,那能不能让项目随着代码的更新而自动重启呢? 既然有了这样的需求,SpringBoot就很暖心的给我们提供了这样的功能。今天我们就来看看SpringBoot中的另一个小花样配置---实现SpringBoot项目的热加载。注意网上也有不少教程把该功能称为热部署,我觉得叫做热加载更准确点!一. SpringBoot热加载简介在SpringBoot中实现热加载相对来说

前言

上一章节中,壹哥 带各位学会了配置自定义的Web端口与项目根目录,今天我们再来看看其他的一些小花样。

在开发阶段,我们编写完代码后,就得需要点击启动按钮,重启项目后才能看到更新后的内容,每次都这么操作,就会就得有点麻烦,那能不能让项目随着代码的更新而自动重启呢? 既然有了这样的需求,SpringBoot就很暖心的给我们提供了这样的功能。今天我们就来看看SpringBoot中的另一个小花样配置---实现SpringBoot项目的热加载。

注意

网上也有不少教程把该功能称为热部署,我觉得叫做热加载更准确点!

一. SpringBoot热加载简介

在SpringBoot中实现热加载相对来说是比较简单的,跟着我一步步实现吧。

1. 概述

Spring Boot为开发者提供了一个名为spring-boot-devtools的额外工具模块,使得Spring Boot应用可以支持热加载功能,以便提高开发者的开发效率,无需我们再手动重启Spring Boot应用,这提升了Spring Boot应用的开发体验。

spring-boot-devtools模块可以被引入到任何SpringBoot项目中,并提供了development-time特性。

2. 热加载原理

spring-boot-devtools之所以可以实现热加载,主要是基于以下原理机制。

热部署和热加载的底层都是基于类加载器实现的,热加载是服务器监听class等文件的改变,然后对改变的文件进行局部加载,所以不会删除session,也不会释放内存。热部署就是全局部署,会清空session以及释放内存。

所以只要我们的项目中使用了spring-boot-devtools插件,如果发现classpath下的java文件有了变动,我们的项目就会自动重启,这样我们就可以很快就能看到代码改变后的效果了。

3. 排除资源

默认情况下,classpath下任何指向文件夹的实体类都会被监控,但是一些资源的修改,尤其是静态的assets,视图模板的改变并不会触发重启应用。具体的,比如更改/META-INF/maven,/META-INF/resources ,/resources,/static,/public 或/templates下的资源不会触发重启,而是触发livereload。

所以我们可以使用spring.devtools.restart.exclude属性,来自定义重启排除规则。比如,为了只排除/static和/public,我们可以这样设置:

spring.devtools.restart.exclude=static/**,public/**

注意:

如果你想保留默认属性,并添加其他的排除规则,可以使用spring.devtools.restart.additional-exclude属性作为代替。

4. livereload简介

在devtools模块中包含一个嵌入的livereload服务器,可以在资源变化时用来触发浏览器刷新。

livereload 通过引入的脚本livereload.js,在 livereload 服务和浏览器之间建立了一个 WebSocket 连接。每当监测到文件的变动,livereload 服务就会向浏览器发送一个信号,浏览器收到信号后就刷新页面,实现了实时刷新的效果。每次启动时,需要点击对应的图标,如下图所示。

我们的浏览器需要在livereload.com网站下载安装扩展插件。Chrome浏览器在应用商店安装livereload插件后,在要自动刷新的页面点击对应的图标,启动应用后更新页面内容或者css等都会触发页面自动刷新。当然这个插件可以安装,也可以不安装。

5. 触发重启的条件

由于DevTools监控的是classpath下的资源,所以唯一触发重启的条件就是更新classpath。引起classpath更新的方式依赖于你使用的IDE工具。如果是在Eclipse里,保存一个修改的文件就会引起classpath的更新,并触发重启。如果是在IntelliJ IDEA中,构建工程(Build → Make Project)也会达到同样的效果。

当判定classpath下实体的改变是否会触发重启时,DevTools自动忽略以下工程:spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter。

注意:

我们也可以通过支持的构建工具(比如,Maven和Gradle)来启动应用,只要开启fork功能,因为DevTools需要一个隔离的应用类加载器执行正确的操作。Gradle默认支持该行为,按照以下配置可强制Maven插件fork进程:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><!-- 如果没有该配置,devtools不会生效 --></configuration></plugin></plugins></build>

6. Restart vs Reload的原理及区别

Spring Boot提供的重启技术是通过使用两个类加载器实现的。没有发生变化的类(比如那些第三方jars)会被加载进一个基础(basic) classloader里面,正在开发的类会加载进一个重启(restart) classloader里面。当应用重启时,restart类加载器会被丢弃,并创建一个新的。这种方式意味着应用重启通常比冷启动(cold starts) 快很多,因为基础类加载器已经可用,并且populated(意思是基础类加载器加载的类比较多)。

如果发现重启对于你的应用来说不够快,或遇到类加载的问题,那可以考虑reload技术,比如JRebel。这些技术是通过重写它们加载过的类来实现的,而Spring Loaded则提供了另一种实现方案,但是很多框架都不支持它,也得不到商业支持。

二. 配置实现热加载

上面的内容主要是给大家普及了Spring Boot热加载的触发条件和实现原理,接下来咱们还是来点干货,看看在代码中到底该怎么配置才能实现热加载。

1. pom.xml配置文件

首先我们要在pom.xml文件中添加热加载的依赖包和插件,并进行必要的配置,代码如下。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><!-- 如果没有该配置,devtools不会生效 --></configuration></plugin></plugins></build>

2. yml配置

然后我们还要在application.yml文件中进行如下配置,当然如果你的配置文件是application.properties也可以,就是注意格式即可。

devtools:  livereload:    enabled: true #是否支持livereload    port: 35729  restart:    enabled: true #是否支持热加载

3. 开启自动构建项目功能

接下来我们需要打开Intellij IDE的项目自动构建功能,请按照如下配置开启。

File-Settings-Compiler-Build project automatically

4. 配置Registry

接下来我们还有配置Registry,在这里勾选其中的一个功能,配置如下:

ctrl + shift + alt + /,选择Registry,勾上 Compiler autoMake allow when app running


5. 安装livereload插件(可选)

我们可以选择安装一个浏览器上运行的livereload插件。在chrome浏览器中下载livereload插件,将其安装到chrome扩展程序中,并选中允许访问文件网址。

6. 测试

以上的配置设置完毕之后,我们就可以进行热加载功能的测试了,看看我们的配置是否有效。你可以随意编写一个Controller,效果如下:

7. 修改类内容

接着我们随便修改一下Java类中的内容,在正常情况下,就会发现代码修改后,我们的IDE控制台就会输出如下内容,表示我们的项目正在进行自动重启。

8. 修改配置文件

上面修改的是类内容,接着我们修改一下项目中的配置文件,比如application.yml或application.properties里的内容,正常情况下,会发现项目也会进行重启,这里我就不再截图展示了。

9. 修改静态文件(html、css等)

那么如果我们修改的是静态文件,html/css等,正常情况下,项目不会自动重启。但是因为我们在浏览器中安装了livereload插件,会触发调用livereload,浏览器会自动刷新,显示出我们修改后的最新内容。

10. 禁用重启

虽然这个热加载看起来蛮帅的,但是一旦我们真的用起来,其实也很操蛋,因为只要我们编写任一行代码,程序就自动重启。你想想,你哪还有心情写代码,刚写一行,程序啪就重启了,所以这个热加载其实就是挺鸡肋的一个功能,如果你不想用了怎么办呢?

如果我们不想使用这个重启特性了,可以通过‘spring.devtools.restart.enabled’属性来禁用。通常情况下可以在application.properties文件中设置(依旧会初始化重启类加载器,但它不会监控文件变化)。

如果需要彻底禁用重启功能,比如,不能跟某个特殊库一块工作,我们可以在调用SpringApplication.run(…)之前设置一个系统属性,如下:

publicstaticvoidmain(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}

结语

至此,壹哥 就带各位了解了一下SpringBoot项目的热加载功能的实现及其底层原理。但是今天的内容,我个人感觉真的很鸡肋,反正我自己写代码时不使用这玩意,太操蛋了。有的小伙伴会问,那你写这个教程干嘛?没别的意思,就是炫技,就是任性,hiahia。感兴趣的小伙伴可以自行设置。

今日小作业:

请在自己的项目中配置热加载,感受热加载的用途,然后再禁用掉。

相关文章
|
6天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
17 0
|
11天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
24 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
10天前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
47 17
|
30天前
|
Java Spring 容器
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【10月更文挑战第15天】在Spring Boot应用中,循环依赖是一个常见问题,当两个或多个Bean相互依赖时,会导致Spring容器陷入死循环。本文通过比较@RequiredArgsConstructor和@Lazy注解,探讨它们解决循环依赖的原理和优缺点。@RequiredArgsConstructor通过构造函数注入依赖,使代码更简洁;@Lazy则通过延迟Bean的初始化,打破创建顺序依赖。两者各有优势,需根据具体场景选择合适的方法。
53 4
|
2月前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
2月前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
|
3月前
|
Java
SpringBoot项目配置热部署启动 及 热部署失效的问题解决
这篇文章介绍了如何在SpringBoot项目中配置热部署启动,包括在pom文件中添加热部署依赖、在IDEA中进行设置、修改配置文件以及IDEA启动设置,以解决热部署失效的问题。
SpringBoot项目配置热部署启动 及 热部署失效的问题解决
|
4月前
|
SQL Java 数据库连接
springboot~mybatis-pagehelper原理与使用
【7月更文挑战第15天】MyBatis-PageHelper是用于MyBatis的分页插件,基于MyBatis的拦截器机制实现。它通过在SQL执行前动态修改SQL语句添加LIMIT子句以支持分页。使用时需在`pom.xml`添加依赖并配置方言等参数。示例代码: PageHelper.startPage(2, 10); List&lt;User&gt; users = userMapper.getAllUsers(); PageInfo&lt;User&gt; pageInfo = new PageInfo&lt;&gt;(users); 这使得分页查询变得简单且能获取总记录数等信息。
104 2
|
缓存 Java Spring
5种SpringBoot热部署方式,你用哪种?
Spring Boot 中 5 种热部署方式如下: 1、模板热部署 2、使用调试模式Debug实现热部署 3、spring-boot-devtools 4、Spring Loaded 5、JRebel
1004 0
|
Java 应用服务中间件 Maven
传统maven项目和现在spring boot项目的区别
Spring Boot:传统 Web 项目与采用 Spring Boot 项目区别
489 0
传统maven项目和现在spring boot项目的区别