SpringBoot热加载实现与类加载浅谈
SpringBoot热加载实现与类加载浅谈
热部署与热加载:
热部署和热加载都是基于类加载器实现的,热加载是服务器监听class等文件的改变然后对改变的文件进行局部加载,所以不会删除session,也不会释放内存。热部署就是全局部署,会清空session以及释放内存。
类加载机制:
java类加载器主要有:
根类加载器(Bootstrap ClassLoader) 一般加载%JAVA_HOME%/jre/lib下的一些jar包的class文件
扩展类加载器(Extension ClassLoader) 一般加载%JAVA_HOME%/jre/lib/ext中jar包的class文件
系统类加载器(System ClassLoader) 一般加载来自java命令的-classpath指定的jar包和类路径
自定义加载器(User ClassLoader) 用户自定义的加载器,默认的父加载器是系统类加载器
这些加载器有一个双亲委派的机制,就是说,当一个加载器接收到请求,他会委托他的父类加载器去加载。如果父类找不到,他才会去加载。举个栗子,java.lang.String 类,如果是系统类加载器接到请求,他会委托给扩展类加载器,扩展类加载器会委托给根类加载器,因为java.lang.String.class是在%JAVA_HOME%/jre/lib/rt.jar下,所以最终由根类加载器加载到JVM内存
类加载的阶段:
加载:将类的class文件读入内存,并创建一个java.lang.Class对象放入方法区
验证:检测被加载的类是否有正确的内部结构,会不会威胁虚拟机的安全等
准备:为static修饰的变量分配内存,并设置初始值,int型的是0,如果是static final修饰的,则进入常量池
解析:将类的二进制数据中的符号引用替换为直接引用。
初始化:当初始化一个类的时候,如果发现其父类还没有进行过初始化、则需要先触发其父类的初始化,将准备阶段的初始值完成赋值。初始化运行主类,比如main方法。
tomcat热部署实现方式:
1.直接把项目的web文件夹放在webapps里
2.在tomcat/conf/server.xml的<host>里添加<context>
<Context docBase="xxx" path="/xxx" reloadable="true"/>
其中docBase是你项目的web文件夹所在的目录,path是用来在浏览器访问项目的虚拟路径。
3.在tomcat/conf/Catalina/localhost/下添加一个xml,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="xxx" reloadable="true"/>
其中docBase和reloadable跟第二步一样,而项目访问的虚拟路径是这个xml文件的文件名。
SpringBoot实现热加载
1.springloaded方式: 通过在maven的plug里加springloaded依赖
注意这种方式只能通过maven的方式去启动。在idea编辑器里可以配置maven启动
注意maven启动命令是mvn spring-boot:run 但是idea已经默认前面加了mvn,所以这里配置不需要再写mvn了。
2.通过spring-boot-devtools方式: 在maven添加依赖
注意用idea编辑器的,idea实现热加载还需要修改两个地方配置
这个要勾选上
然后按shift+alt+ctrl+/
这个勾选上。到此就ok了。
自定义加载器实现热加载
用户自定义加载器需要继承ClassLoader,实现原理就是通过一个线程去监听文件的修改时间,然后重写findClass方法,把文件以流的形式读进来,然后调defineClass方法。在JDK1.2之后,双亲委派模式已经被引入到类加载体系中,因此不建议重写loadClass方法,只需要重写findClass就可以了
这里是重写findClass核心代码。
原作者:catalina_ 转载来源:https://www.jianshu.com/p/cb6421d69383 非常感谢原作者的杰出贡献,转载文章仅供学习参考,如有侵权,敬请联系,以便及时删除
SpringBoot热加载实现与类加载浅谈相关推荐
- html 中加载字体太慢,浅谈CSS字体的加载加速问题
除了各种特定字体系列外(如 Times.Verdana.Helvetica 或 Arial),CSS定义了 5 种通用字体系列: Serif 字体 这些字体成比例,而且有上下短线.如果字体中的所 ...
- 查看类的实现类mac_自定义类加载器实现热加载
一.实现的需求 当一个java被修改后,系统无需重启,替换的类立即生效,这里以Work.java为例 二.实现的思路 1)难点分析 当项目在执行的时候,我们修改了Work.java,这个类的class ...
- springboot基于Elasticsearch6.x版本进行ES同义词、停用词(停止词)插件配置,远程词典热加载及数据库词典热加载总结,es停用词热更新,es同义词热更新
前言:ES版本差异较大,建议跨版本的同学,可以先了解一下版本区别,建议不要跨版本使用插件或者进行项目调试. 本总结主要基于6.x版本的6.5.1(6.2.2实测可用),分词器为IK,下载地址:http ...
- SpringBoot+gradle+idea实现热部署和热加载
前言 因为之前使用myeclipes的同学就知道,在使用myeclipes的时候,java文件或者jsp文件写完之后会被直接热加载到部署的容器中,从而在开发的时候,不同经常去重启项目,从而达到了增加开 ...
- 后端技术:SpringBoot配置热加载工具(devtools)笔记
今天给大家介绍IDEA开发工具如何配置devtools热加载工具. 1.devtools原理介绍 spring-boot-devtools是spring为开发者提供的热加载工具包. 主要原理是使用了两 ...
- springboot mybatis 热加载mapper.xml文件(最简单)
大家好,我是烤鸭: 今天介绍一下springboot mybatis 热加载mapper.xml文件. 本来不打算写的,看到网上比较流行的方式都比较麻烦,想着简化一下. 网上流行的版本. https: ...
- idea拦截了html中的静态资源,IDEA配置静态资源热加载操作(Springboot修改静态资源不重启)...
第一步: 修改file->settings->compiler->build project automatically 第二步: 按ctrl+shift+a,搜索Registry双 ...
- spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃
spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃 一.springboot devtool ...
- 热加载和热部署,没听过?看看 Tomcat 是怎么实现的
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 不学无数的程序员 来源 | https://urlify ...
最新文章
- 使用 ThinkJS + Vue.js 开发博客系统
- Handlebars partials 隐藏的力量
- 2.Android的学习(Android的环境搭建)
- jmeter压测过程中内存溢出
- 【HTML5 video】video标签的部分属性解析
- android 属性动画变大,Android PropertyAnimation 属性动画(一)初探
- JavaScript 字符串转数字
- 常量池在堆还是方法区_第九章_方法区
- java 线程池 资源回收_JAVA线程池资源回收的问题
- linux下Mariadb的二进制安装
- android让图片旋转
- python post请求参数化,参数化包含JSON主体的python POST请求
- 基于android的个人记账系统,android平台的个人记账系统的设计与实现.docx
- 简单有限元分析技术(详细步骤讲解)
- php日期时间戳转换
- 项目经理的五个关键成功因素
- 盘点人工智能高薪职位
- 自监督学习论文、代码汇总
- 组策略禁止自动锁定计算机,次次都登录太麻烦 教你关闭Win10锁屏
- Unsupervised Hyperspectral Mixed Noise Removal Via Spatial-Spectral Constrained Deep Image Prior