热部署原理
热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。简而言之就是在修改正在运行的运用的代码的时候不需要重新启动整个应用,被修改的代码会立即生效。
对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB(Enterprise JavaBean)服务器和Servlet容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。
springboot热部署
在springboot开发中,springloaded不能实现热部署,导致每次修改项目代码的时候都要手动的去重启后台运用,这个大大降低了开发的效率。可以通过spring-boot-devtools模块提供热部署支持;spring-boot-devtools可以不用重启应用程序就会自动把修改过的代码更新到已经在运行的App上,实际上其本质还是重启服务只是重启的速度远远大于手动重启的速度罢了。
其实springboot热不是使用spring-boot-devtools的深层次原理是使用了两个classLoader,一个classloader用于加载哪些不会改变的类(比如第三方jar包依赖);另一个classLoader是专门负责加载哪些代码改变之后的字节码,这样的classLoader叫做restart classloader;通过restart ClassLoader这样的类加载器丢弃了原来的字节码,重新加载改变之后的字节码,这样选择加载部分字节码重启应用的速度得到了很好的保障;
值得注意的是:采用spring-boot-devtools模块实现热部署会导致整个应用的session会话全部是失效,应该谨慎使用;(配合redis实现会话管理最好)。
基于Idea实现springboot应用热部署
- 在Idea maven web工程的pom.xml文件中引入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入thymeleaf模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--引入springboot热部署模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<plugins>
<!--加入springboot-maven-plugins-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--如果不配置该项,应用将不会进行热部署-->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
- 编写一个TestController
package com.tedu.cn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
1. @phone:13595672347
2. @qq:1441826270
3. @作者:雷玉荣
4. @date 2019/5/5 23:00
*/
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
System.out.println("你好马哥20191205623012");
return "index";
}
}
- 编写应用启动类
package com.tedu.cn;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @phone:13595672347
* @qq:1441826270
* @作者:雷玉荣
* @company: 贵州达内科技有限公司
* @program 程序 = 数据结构 + 算法 (构成元素 + 运行机理)
* @comment 达内教育专注于做技术人的指路明灯,
* 职场生涯的精神导师
* @date 2019/5/5 22:50
*/
@SpringBootApplication
public class App {
public static void main(String[] args) {
//启动springboot
SpringApplication.run(App.class);
}
}
-
开启Idea make功能,否则热部署会失效。
找到Idea settings 输入compiler,将下图中的位置打勾。
-
Ctr+Shift+A 输入registry,在下图选项打勾
-
启动App运用调试
调试前index.html页面类容:
调试前后台测试代码:
浏览器运行结果:
后台控制台输出:
更改index.html页面代码:
更改后台代码:
浏览器运行结果:
后台输出:
可以看出热部署已经生效!
值得注意的是:要想修改页面的时候使修改的页面也要生效必须设置springboot
应用的applicaiton.properties文件,如下:
-
热部署不生效的可能原因
a.对应的springboot-devtools版本不对
b.是否加入plugin 以及true
c.设置SpringApplication.setRegisterShutdownHook(false)
以上三点热部署将会失效!