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热加载实现与类加载浅谈相关推荐

  1. html 中加载字体太慢,浅谈CSS字体的加载加速问题

    除了各种特定字体系列外(如 Times.Verdana.Helvetica 或 Arial),CSS定义了 5 种通用字体系列: Serif 字体    这些字体成比例,而且有上下短线.如果字体中的所 ...

  2. 查看类的实现类mac_自定义类加载器实现热加载

    一.实现的需求 当一个java被修改后,系统无需重启,替换的类立即生效,这里以Work.java为例 二.实现的思路 1)难点分析 当项目在执行的时候,我们修改了Work.java,这个类的class ...

  3. springboot基于Elasticsearch6.x版本进行ES同义词、停用词(停止词)插件配置,远程词典热加载及数据库词典热加载总结,es停用词热更新,es同义词热更新

    前言:ES版本差异较大,建议跨版本的同学,可以先了解一下版本区别,建议不要跨版本使用插件或者进行项目调试. 本总结主要基于6.x版本的6.5.1(6.2.2实测可用),分词器为IK,下载地址:http ...

  4. SpringBoot+gradle+idea实现热部署和热加载

    前言 因为之前使用myeclipes的同学就知道,在使用myeclipes的时候,java文件或者jsp文件写完之后会被直接热加载到部署的容器中,从而在开发的时候,不同经常去重启项目,从而达到了增加开 ...

  5. 后端技术:SpringBoot配置热加载工具(devtools)笔记

    今天给大家介绍IDEA开发工具如何配置devtools热加载工具. 1.devtools原理介绍 spring-boot-devtools是spring为开发者提供的热加载工具包. 主要原理是使用了两 ...

  6. springboot mybatis 热加载mapper.xml文件(最简单)

    大家好,我是烤鸭: 今天介绍一下springboot mybatis 热加载mapper.xml文件. 本来不打算写的,看到网上比较流行的方式都比较麻烦,想着简化一下. 网上流行的版本. https: ...

  7. idea拦截了html中的静态资源,IDEA配置静态资源热加载操作(Springboot修改静态资源不重启)...

    第一步: 修改file->settings->compiler->build project automatically 第二步: 按ctrl+shift+a,搜索Registry双 ...

  8. spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃

    spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃 一.springboot devtool ...

  9. 热加载和热部署,没听过?看看 Tomcat 是怎么实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 不学无数的程序员 来源 | https://urlify ...

最新文章

  1. 使用 ThinkJS + Vue.js 开发博客系统
  2. Handlebars partials 隐藏的力量
  3. 2.Android的学习(Android的环境搭建)
  4. jmeter压测过程中内存溢出
  5. 【HTML5 video】video标签的部分属性解析
  6. android 属性动画变大,Android PropertyAnimation 属性动画(一)初探
  7. JavaScript 字符串转数字
  8. 常量池在堆还是方法区_第九章_方法区
  9. java 线程池 资源回收_JAVA线程池资源回收的问题
  10. linux下Mariadb的二进制安装
  11. android让图片旋转
  12. python post请求参数化,参数化包含JSON主体的python POST请求
  13. 基于android的个人记账系统,android平台的个人记账系统的设计与实现.docx
  14. 简单有限元分析技术(详细步骤讲解)
  15. php日期时间戳转换
  16. 项目经理的五个关键成功因素
  17. 盘点人工智能高薪职位
  18. 自监督学习论文、代码汇总
  19. 组策略禁止自动锁定计算机,次次都登录太麻烦 教你关闭Win10锁屏
  20. Unsupervised Hyperspectral Mixed Noise Removal Via Spatial-Spectral Constrained Deep Image Prior

热门文章

  1. MongoDB 教程番外篇之管理工具: Rockmongo
  2. Create new module “HelloWorld” – in Magento
  3. 通过GeoIP获取ip所属地 (国家,城市,时区,邮编,经纬度等)
  4. 11个实用jQuery日历插件
  5. 点击空链接,页面不跳到页头
  6. 人工智障学习笔记——深度学习(3)递归神经网络
  7. SLAM常用数据集(2)
  8. Tensorflow学习—— 预创建的 Estimator
  9. 《C和指针》——将无符号整数转换为字符
  10. 【CVPR2019】论文完整列表一