Java笔记:SpringBoot热部署与热加载

简介: Java笔记:SpringBoot热部署与热加载

课程介绍

1、热部署使用场景

  • 本地调试
  • 线上发布

2、优点

  • 本地、线上都适用
  • 无需重启服务器

3、前置知识

  • Java语言
  • Spring开发经验
  • 构建SpringBoot项目

4、课程大纲

  • 热部署原理分析
  • 案例分析
  • 项目演示
  • 测试
  • 发布程序

热部署与热加载

1、Java热部署与热加载联系

  • 不重启服务器编译/部署项目
  • 基于Java的类加载器实现
  • 课程总结

2、Java热部署与热加载区别

2.1、部署方式

  • 热部署在服务器运行时重新部署项目
  • 热加载在运行时重新加载class

2.2、实现原理

  • 热部署直接重新加载整个应用
  • 热加载在运行时重新加载class

2.3、使用场景

  • 热部署多用于生产环境
  • 热加载多用于开发环境

热部署原理解析

1、Java类加载过程

初始化JVM
-> 产生启动类加载器(子类,自动加载)
-> 标准扩展类加载器
-> 系统类加载器
-> 加载class文件

2、类加载的5个阶段

加载 允许用户参与
验证
准备
解析
初始化

3、初始化时机5个

1、new (final修饰的类会放在常量池)
2、反射
3、初始化类的时候其父类没有初始化
4、主类
5、static


4、Java类加载器特点

  • 由AppClass Loader(系统类加载器)开始加载执行的类
  • 类加载器将加载任务交给其父,如果其父找不到,再由自己去加载
  • Bootstrap Loader(启动类加载器)是最顶级的类加载器

5、Java类的热部署


类的热加载实现

配置Tomcat实现热部署

直接把项目web文件夹放在webapps里

在tomcat\conf\server.xml中 <host></host>内部添加<Context/>标签

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


tomcat\conf\server.xml


<Context  path="/hot" docBase="webapps" crossContext="true" debug="0" privileged="true"  reloadable="true">

</Context>


tomcat\conf\Catalina\localhost\demo.xml


使用文件名作为路径名


<?xml version="1.0" encoding="UTF-8"?>

<Context docBase="websites"  reloadable="true"/>


Java类热加载案例分析

实现:

1、类层次结构清晰,修改某一个java类文件不需要重启服务或者重新编译运行程序

2、可以适当的运用一些设计模式使代码结构更加清晰明了,比如工厂模式

核心类MyClassLoader

SpringBoot

简化开发,库的集合

Restful、微服务

spring-tool-suite

Spring Boot热部署的实现

方式:

  1. Spring Loaded
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <dependencies>
                <!-- https://mvnrepository.com/artifact/org.springframework/springloaded -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>springloaded</artifactId>
                    <version>1.2.8.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

运行项目

$ mvn spring-boot:run
• 1
  1. Spring-boot-devtools
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

IDEA修改项目文件后需要重新编译

SpringBoot发布方式

  • 构建Jar包,命令行运行SpringBoot程序
  • 构建war包,发布到Tomcat

1、构建Jar包


# 打包

$ mvn package


# 运行

$ java -jar target/demo-0.0.1-SNAPSHOT.jar



2、构建war包


(1)修改配置文件3处


<packaging>war</packaging>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
<build>
    <!--生成war包的名称-->
    <finalName>demoapp</finalName>
</build>



(2) 新建类,Application为主类名


package com.example.demo;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}



打包


$ mvn clean package


将打包后的war包放入webapps目录下,会自动解压


还可以在新建SpringBoot项目的时候直接选择war包方式


遇到的问题:

使用 Apache Tomcat/7.0.100没有访问成功 出现404


Apache Tomcat/9.0.39 可以成功访问到


相关文章
|
14天前
|
Java
Java基础—笔记—static篇
`static`关键字用于声明静态变量和方法,在类加载时初始化,只有一份共享内存。静态变量可通过类名或对象访问,但推荐使用类名。静态方法无`this`,不能访问实例成员,常用于工具类。静态代码块在类加载时执行一次,用于初始化静态成员。
10 0
|
14天前
|
Java API 索引
Java基础—笔记—String篇
本文介绍了Java中的`String`类、包的管理和API文档的使用。包用于分类管理Java程序,同包下类无需导包,不同包需导入。使用API时,可按类名搜索、查看包、介绍、构造器和方法。方法命名能暗示其功能,注意参数和返回值。`String`创建有两种方式:双引号创建(常量池,共享)和构造器`new`(每次新建对象)。此外,列举了`String`的常用方法,如`length()`、`charAt()`、`equals()`、`substring()`等。
15 0
|
22天前
|
缓存 前端开发 Java
【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】
【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--希尔排序
数据结构与算法(Java篇)笔记--希尔排序
|
27天前
|
Java 应用服务中间件 Spring
SpringBoot出现 java.lang.IllegalArgumentException: Request header is too large 解决方法
SpringBoot出现 java.lang.IllegalArgumentException: Request header is too large 解决方法
42 0
|
6天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
54 10
|
6天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
7天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
33 6
|
14天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
9 0
|
21天前
|
JavaScript Java 关系型数据库
基于 java + Springboot + vue +mysql 大学生实习管理系统(含源码)
本文档介绍了基于Springboot的实习管理系统的设计与实现。系统采用B/S架构,旨在解决实习管理中的人工管理问题,提高效率。系统特点包括对用户输入的验证和数据安全性保障。功能涵盖首页、个人中心、班级管理、学生管理、教师管理、实习单位管理、实习作业管理、教师评分管理、单位成绩管理和系统管理等。用户分为管理员、教师和学生,各自有不同的操作权限。