springBoot之路(3)-热部署

1.何为热部署

热部署,即在不停服务的前提下,实现应用的部署和服务的重加载。

2.误区

热部署的作用是:给程序员在开发时使用,减少修改代码重启步骤。不是为生产上线部署提供支持

3.底层实现

springBoot的热部署是使用ClassLoader重新加载代码实现。
不使用springBoot热部署时,springBoot只启动一个ClassLoader,加载代码信息,完成后,形成spring容器就是当前的上下文。
使用springBoot热部署时,会启动两个ClassLoader,假设编号为cl-a和cl-b。第一次启动的时候,cl-a进行代码的加载,形成一个Spring容器作为应用上下文,SpringBoot会启动一个线程,做.class文件扫描,如果.class文件发生了变化,则使用cl-b加载修改后的.class文件,重新初始化spring容器并和cl-a初始化的spring容器做merge合并。这种合并可以保证环境是最新的,且只加载修改后的内容,节约初始化时间,提高初始化效率。

4.Eclipse使用ClassLoader进行热部署开发

方式一:插件启动(不推荐使用),需要在应用的pom文件中依赖对应的插件,具体如下:
在这里插入图片描述
在启动应用的时候,需要通过Maven命令来启动。在run as -> maven build…面板的goals中输入: spring-boot:run来启动应用。
SpringLoader插件启动的应用,会启动一个系统进程来提供服务,进程是java.exe(windows系统中)。所以在eclipse中关闭执行线程是不能关闭这个应用的。只能在任务管理器中关闭这个进程才能完整关闭应用。
SpringLoader热部署启动,只能热部署java代码应用,对thymeleaf等静态资源无法实现热部署。

方式二:代码启动,提供JVM启动参数
在这里插入图片描述
这个jar包不需要add to build path。因为这个jar包用于JVM启动参数提供的。只需要在run as -> run configurations面板中,添加VM arguments即可。添加内容为:
-javaagent:.\libs\springloaded-1.2.8.RELEASE.jar -noverify
这种启动方式不会开启新的java进程,可以在eclipse中完整关闭应用。但同样只能热部署java代码,不能热部署thymeleaf等静态模板。使用application.properties配置spring.thymeleaf.cache=false关闭thymeleaf的缓存。可以实现thymeleaf热部署?这种方式不是热部署。是关闭spring容器对thymeleaf的缓存,代表每次访问显示这个thymeleaf对应的视图逻辑的时候,都需要java代码进行重新渲染。会降低静态视图的显示效率,和Servlet显示视图逻辑的效率是一致的,因为不能使用静态资源服务器实现静态数据缓存。
注意:1.如果启动后无效,请检查该项目所在的路径是否有中文文件夹。2.修改完代码记得按保存,否则无效。

方式三:DevTools工具
DevTools工具并不是严格意义上的热部署,是使用重新部署的方式实现应用环境再次加载的。也就是DevTools会导致应用瞬间的关闭和启动。使用DevTools工具,需要在工程pom中依赖对应的资源:
在这里插入图片描述
DevTools底层实现原理:使用两个ClassLoader,一个ClassLoader加载那些不会改变的类(第三方jar),另一个ClassLoader加载会更改的类,称为“restart ClassLoader”,代码变更,原有的restart ClassLoader被丢弃,重新创建restart ClassLoader,由于加载的类比较少,实现快速重启。
配置文件需要以下配置:
spring.devtools.restart.enabled=true #DevTools热部署生效
spring.devtools.restart.additional-paths=src/main/java #设置文件变化需要重启服务的路径
#设置文件不变化需要重启服务的路径,默认/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public
#路径中的内容修改不会重启服务,但是会重新加载静态内容。
spring.devtools.restart.exclude: WEB-INF/**

启动时也需要配置JVM启动参数
在这里插入图片描述当你更新代码时,服务会自动快速重启。
百度网盘地址:链接:https://pan.baidu.com/s/1uDFZjleUrCNYRgU05FhbSg 提取码:e12r

猜你喜欢

转载自blog.csdn.net/cipare9708/article/details/88120471