Spring Boot热部署 学习笔记

实现原理
热部署:直接重新加载整个工程
热加载:在运行时重新加载字节码文件(基于classloader)

Java热部署和热加载的联系
不重启服务器编译/部署项目
基于Java的类加载器实现

部署方式上的区别
热部署在服务器运行时重新部署项目(不用重启服务器)—节省运维时间,提高效率。
热加载在运行时重新加载class.(Java字节码文件)—当Java类做了一定的修改时, 不需要重启服务, 编译后的字节码文件就可以更新同步。


类加载的五个阶段
		加载:找到java的静态存储结构并加载到虚拟机内,转换为方法区运行时使用的数据结构,生成class对象,用户可以自定义类加载器参与进来
		验证:确保字节码是安全的,确保不会对虚拟机造成危害,可以通过虚拟机的启动参数来禁用一些验证(不推荐)
		准备:确定内存布局,初始化类变量,是赋初始值(例如:静态变量等赋为0),不会执行方法中赋值语句
		解析:将符号引用变为直接引用
		初始化:调用程序自定义代码(例如:静态变量真正赋值为12)

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



java类加载器特点
1、由AppClass Loader (系统类加载器)开始加载指定的类
2、类加载器将加载任务交给其父,如果其父找不到,再由自己去加载
3、Bootstrap Loader(启动类加载器)是最顶级的类加载器(BootstrapClassLoader是C++实现的,其没有对应的Java子类,只是名义上的所有类加载器父类,因为在ClassLoader中当parent委托对象为null的话会默认BootstrapClassLoader为parent)

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

  


二、配置Tomcat
1、直接把项目web文件夹放再webapps里。
2、在tomcat\conf\server.xml中的<host></host>内部添加<context/>标签。
<Context debug="0" docBase="D:/Imooc/web" path="/hot" privileged="true" reloadable="true"/>

  3、在%tomcat_home%\conf\Catalina\localhost中添加一个XML

<?xml version="1.0" encoding="UTF-8"?>
<Context  docBase="D:/Imooc/web" reloadable="true"/>

 

 
 
posted @ 2018-02-26 11:22  摩西摩西点点  阅读(130)  评论(0编辑  收藏  举报