SpringBoot热部署简介

首先来看看 JAVA 热部署与热加载的联系:

  1. 都可以不重启服务器的情况下进行编译/部署项目;
  2. 基于 Java 的类加载器实现

热部署与热加载的区别:

  • 热部署在服务器运行时重新部署项目
  • 热加载在运行时重新加载 class (字节码文件)
    只加载重新修改后的类(class 文件)
  • 热部署会重新加载整个应用
  • 热加载在运行时重新加载 class
    可以理解为 JVM 启动后会启动一个后台线程,定时来监控文件的时间戳,如果变化就将类重新载入
  • 热部署更多在生产环境下使用,热加载多在开发环境下使用(热加载无法记录“热加载执行的日志”)

下面再来说一下 JVM 加载类的相关知识点,字节码文件肯定是通过类加载器进行加载的,类加载一般可分为五个阶段:

  1. 加载
    找到类的静态存储结构,加载到虚拟机里然后转化成方法区运行时的数据结构,生成 class 对象;
    允许用户自定义类加载器参与进来
  2. 验证
    确保字节码是安全的,不会对虚拟机造成危害,可以通过启动参数来禁用一些验证(不推荐)
  3. 准备
    确定内存布局,初始化类变量(给变量赋初始值不会执行程序自定义的赋值操作)
  4. 解析
    将符号引用转换为直接引用
  5. 初始化
    这里才是调用程序自定义的初始化代码

关于初始化阶段,Java 规定在遇到五个时机时立即进行初始化(当然前面的步骤已经执行完了的情况下),需要注意的点有:

  • 遇到了 new、get、static 这几个字节码指令时如果类没有初始化,则需要触发初始化。
  • final 修饰的类会在编译时把结果放到常量池中,即使调用也不会触发初始化。毕竟 final 关键字它修饰的是常量。
  • 使用反射对类进行反射调用,如果类没有进行初始化,就需要先初始化。
  • 当初始化一个类的时候,如果发现其父类还没有进行过初始化,需要先触发父类的初始化。
    也就是先初始化父类,再初始化子类。
  • 虚拟机启动的时候用户需要制定一个要执行的主类,虚拟机会先初始化这个主类。
  • 使用 jdk1.7 动态机制相关的句柄会进行初始化。

Java 类加载器的特点:

  • 由 APPClass Loader (系统类加载器)开始加载指定的类。
  • 类加载器将加载任务交给其父,如果其父找不到,再由自己去加载。
  • BootStrap Loader (启动类加载器)是最顶级的类加载器,也就是说他的父加载器为空。

Java 类的热部署可分为 类的热加载 和 配置 Tomcat 的方式,配置 Tomcat 应该很熟悉了,关于类的热加载相关代码参考:

// 自定义的类加载器
public class MyClassLoader extends ClassLoader{
  private String path;

  public MyClassLoader(String path){
    super(ClassLoader.getSystemClassLoader());
    this.path = path;
  }

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException{
    System.out.println("加载类.....");
    byte[] data = loadClassData(name);
    return this.defineClass(name,data,0,data.length);
  }

  // 加载 Class 文件中的内容
  private byte[] loadClassData(String name){
    try{
      name = name.replace(".", "//");
      FileInputStream is = new FileInputStream(new File(path + name + ".class"));
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      int b = 0;
      while((b = is.read()) != -1){
        baos.write(b);
      }
      is.close();
      return baos.toByteArray();
    }catch(Exception e){
      e.printStackTrace();
    }
    return null;
  }
}

对于Tomcat 直接把项目放到 webapps 目录里就会自动加载;server.xml 里的 host 添加 context

SpringBoot

使用 SpringBoot 进行热部署总体来说有两种方式,

一种是使用 springloaded(依赖配置在 build 中的 spring-boot-maven-plugin 插件中),必须要使用 mvn spring-boot:run 来允许才有效果,或者下载这个 jar 在 JVM 的启动参数里配置。

第二种就比较简单了,直接和平常一样加入一个 devtools 依赖就可以了:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>

是的,就是这么简单,推荐使用第二种

发布

SpringBoot 项目可以使用 jar 包来直接运行,也可以发布为 war 丢到 tomcat 里去允许,

第一种就不用多说了,运行 maven 的 install 后,直接命令行启动就行:java -jar xxx.jar

第二种,首先打包方式改为 war 包,然后增加一个,然后在 application 入口类继承 SpringBootServletInitializer,复写 configure 方法:

// @SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置
@SpringBootApplication
public class FirstSpringBootApplication extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
    return builder.sources(FirstSpringBootApplication.class);
  }

  public static void main(String[] args) {
    // 启动 SpringBoot 所必须的入口
    SpringApplication.run(FirstSpringBootApplication.class, args);
  }
}

需要加入的依赖,SpringBoot 中加依赖不需要指定版本,在父工程已经设置好了,并且名称都是 spring-boot-* :

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

然后执行 maven install 得到 war 包就可以了

原文地址:https://www.cnblogs.com/dudadi/p/8137757.html

时间: 2024-10-27 07:13:19

SpringBoot热部署简介的相关文章

Springboot 热部署中存在冲突的问题

SpringBoot热部署有2中: 1.使用 Spring Loaded 2.使用 spring-boot-devtools 具体怎么用.自己百度! 在使用第一种时候,整合SpringBoot和通用Mapper时候,-----------------> Example 时候会出现找不到实体对应的表! 这就是冲突在的存在,具体怎么解决,我没找到方法!  当然我还是想用热部署的,我就使用了第2种,但是依然也遇到了问题 在我的项目中我加入了redis 注解什么意思自己百度:出现的异常java.lang

SpringBoot热部署的两种方式

SpringBoot热部署方式一共有两种,分别使用两种不同的依赖 SpringBoot 1.3后才拥有SpringBoot devtools热部署 ①:spring-boot-devtools   ②:Spring Loaded 方式一: 在项目的pom文件中添加依赖: 1 <!--热部署jar--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId&g

热部署简介及在eclipse安装插件JRebel进行热部署

一.热部署简介 1.热部署与热加载在应用运行的时候升级软件,无需重新启动的方式有两种,热部署和热加载.它们之间的区别是:(1).部署方式: 热部署在服务器运行时重新部署项目.热加载在运行时重新加载class.(2).实现原理热部署直接重新加载整个应用,这种方式会释放内存,比热加载更加干净,但是它比热加载更加的浪费时间.热加载在运行时重新加载class,主要使用的是类加载机制,在实现方式上就是在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳发生变化,则将类重新载入.(3

springboot热部署(二)——springboot热部署与发布

一.实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File-Settings-Compiler-Build Project automatically 二.spring-boot-devtools 在pom中直接引入依赖 <dependency> <groupId>org.springframework.boot</groupId>

在 IDEA 中使用 JRebel 实现 SpringBoot 热部署

在最近 SpringBoot 项目中使用 spring-boot-devtools 没有达到热部署,所以另找方法使用 JRebel 来实现,下面分享一下具体实现过程. 一.安装 JRebel 插件 在 Plugins 中搜索 JRebel for IntelliJ 并安装. 二.激活 JRebel 插件 可以选择 试用 或者 其他的激活方法 三.配置 在 Setting -> Build, Execution, Deployment -> Compiler 勾选 Build project a

SpringBoot(4) SpringBoot热部署

热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用. 使用springboot结合dev-tool工具,快速加载启动应用 官方地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools 核心依赖包: <dependency> <groupId>org.springframework.boot</groupId>

带着新人学springboot的应用13(springboot+热部署)

spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫做热部署,看到这名字就吓退了我继续学习的欲望!),但是实际上可以把这个看成是一个小技巧. 就是导入一个依赖,要用的时候,就是快捷键操作:Ctrl+F9 有什么用呢?就是避免你每次对springboot修改一点东西,就要重新启动springboot应用,贼麻烦!而且对于电脑性能不怎么样的小伙伴来说(咳

SpringBoot热部署-解决方案

在SpringBoot中启用热部署是非常简单的一件事,因为SpringBoot为我们提供了一个非常方便的工具spring-boot-devtools,我们只需要把这个工具引入到工程里就OK了,下面我就说一下怎么引入spring-boot-devtools. 修改pom.xml 我们只需要在pom.xml里,引入相应的jar包就行了. <dependency> <groupId>org.springframework.boot</groupId> <artifact

Springboot 热部署问题。亲测可用。

本人开发使用的是Mac系统,windows应该类似.主要是 spring-boot-devtools的使用 参考:mac下的idea设置,是不是有疑问,既然别人写好了,为啥你还要再来一次,因为我使用了之后 并没有什么效果,,一度怀疑他们写的是不是假的,其实他们写的没有错,只是还不是全部的步骤! ( 然后再发请求,idea 检测到文件变化后 大功告成!!!spring-boot-devtools配合idea正确的使用姿势! ======之前使用jrebel 插件做开发环境的热部署(那时还没用spr