Spring boot实现热部署的两种方式详解

 更新时间:2017年04月28日 11:11:20   作者:Be a funny man.  
这篇文章主要介绍了Spring boot实现热部署的两种方式,这两种方法分别是使用 Spring Loaded和使用spring-boot-devtools进行热部署,文中给出了详细示例代码和介绍,需要的朋友可以参考学习,下面来一起看看吧。

热部署是什么

大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的 Class 文件,这个文件里记录着和代码等对应的各种信息,然后 Class 文件将被虚拟机的 ClassLoader 加载。

而热部署正是利用了这个特点,它监听到如果有 Class 文件改动了,就会创建一个新的 ClaassLoader 进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前。

类加载机制

Java 中的类经过编译器可以把代码编译为存储字节码的 Class 文件,该 Class 文件存储了各种信息,最终要加载到虚拟机中运行使用。

类加载机制(摘自《深入理解 Java 虚拟机》)

      虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。

Spring Boot 实现热部署

Spring Boot 实现热部署很简单,我们使用上一章创建的项目 Springboot 创建简单的 web 交互应用 来演示。

springloaded

在 POM 文件中添加依赖

<build>
 <plugins>
 <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <dependencies>
   <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>springloaded</artifactId>
    <version>1.2.6.RELEASE</version>
   </dependency>
  </dependencies>
 </plugin>
 </plugins>
</build>

添加完毕,启动项目

Note

这次启动不能直接运行 main 方法了,需要使用
mvn spring-boot:run 启动,然后随意在代码中写一个 System.out.println("Hi") ,再次调用那个方法,会发现控制台会打印出 Hi。

spring-boot-devtools

添加 POM 文件依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-devtools</artifactId>
 <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
</dependency>

然后还是使用 mvn spring-boot:run 启动项目,随意更改代码即可看到效果。

如果我们想指定让 devtools 监听指定文件夹,那么可以在 application.yml 配置
spring.devtools.restart.additional-paths=your path,注意这里需要改成 yml 文件的格式。

Important(特别注意)

可能会有同学按照以上方法处理了都无效。

这里要特别注意下:由于热部署是监听 Class 文件的变化,它自身不会主动去编译 Java 文件,所以我们得在 Java 文件改动时,自动编译成 Class 文件,然后热部署工具创造的新的类加载器才会加载改变后的 Class 文件。

所以,如果你使用 IDEA 开发工具的话,记得要把自动编译打开。

如图打钩即可。

由于热部署的时候是产生了新的类加载器,我们的一个类可能在虚拟机中存在两个类,比如代码中就一个 User 类,但是虚拟机中会存在两个 User ,虽然是同一个 Class 文件,但是却是两个独立的类,这个要清楚。

由于第一次使用热部署,一开始遇到个很奇怪的问题,A instanceof A == false,明明两个 A.getClass() 都一样,但结果就是 false,还问了几个朋友,表示都没遇到,后来当我把 devtools 依赖注释后,才正确执行。

如果有遇到类似问题的朋友,可以检查下是不是由于不同的 ClassLoader 造成的。

本系列所有代码已同步到 GitHub, 项目地址 github:sboot-learn,大家也可以通过本地进行下载。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • idea下如何设置项目启动的JVM运行内存大小

    idea下如何设置项目启动的JVM运行内存大小

    这篇文章主要介绍了idea下如何设置项目启动的JVM运行内存大小问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java中如何取出String字符串括号中的内容

    Java中如何取出String字符串括号中的内容

    这篇文章主要介绍了Java中如何取出String字符串括号中的内容问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • BeanUtils.copyProperties在拷贝属性时忽略空值的操作

    BeanUtils.copyProperties在拷贝属性时忽略空值的操作

    这篇文章主要介绍了BeanUtils.copyProperties在拷贝属性时忽略空值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java深入讲解Object类常用方法的使用

    Java深入讲解Object类常用方法的使用

    前面java继承中说到的Object类是java中一个特殊的类,所有的类都是直接或者间接的继承自Object类,即如果某个类没有使用extends关键字则默认是java.lang.Object类的子类,所以所有的类都可以使用Object类中定义的方法,下面介绍Object类的常用方法
    2022-04-04
  • Mybatis中连接查询和嵌套查询实例代码

    Mybatis中连接查询和嵌套查询实例代码

    这篇文章主要给大家介绍了关于Mybatis中连接查询和嵌套查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 详细讲解springboot如何实现异步任务

    详细讲解springboot如何实现异步任务

    异步:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。也就是说无论异步方法执行代码需要多长时间,跟主线程没有任何影响,主线程可以继续向下执行
    2022-04-04
  • SpringBoot集成Curator实现Zookeeper基本操作的代码示例

    SpringBoot集成Curator实现Zookeeper基本操作的代码示例

    Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务,ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户,本文给大家介绍了SpringBoot集成Curator实现Zookeeper基本操作,需要的朋友可以参考下
    2024-05-05
  • Struts2 Result 返回JSON对象详解

    Struts2 Result 返回JSON对象详解

    这篇文章主要讲解Struts2返回JSON对象的两种方式,讲的比较详细,希望能给大家做一个参考。
    2016-06-06
  • maven的pom.xml中profiles的作用详解

    maven的pom.xml中profiles的作用详解

    这篇文章主要介绍了maven的pom.xml中profiles的作用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Springboot实现高吞吐量异步处理详解(适用于高并发场景)

    Springboot实现高吞吐量异步处理详解(适用于高并发场景)

    这篇文章主要介绍了Springboot实现高吞吐量异步处理详解(适用于高并发场景),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论