二、新版本JDK和SpringBoot特性介绍
新版本JDK和SpringBoot特性
本项目采用JDK17
和SpringBoot3
,在进行项目开发之前,先要了解JDK9-JDK17
的新特性和SpringBoot3
的新特性
JDK9新特性
jshell交互式工具
JDK9
中引入了命令行交互工具jshell
,直接可以运行对应Java
代码
模块化开发
JDK8
及以前将package
作为顶级组件,JDK9
将模块作为顶级组件
不同模块之间的相互引用问题,可以通过Maven
加入依赖的方式引用
在JDK9
之后,可以通过模块化方式引用
- 使用
module-info.java
来申明一个模块,一个模块只能有一个该文件,且该文件在顶层包同目录 - 使用
exports
来申明可以被外部引用的包,可以有多个exports
语句- 一个
module
中能够被外部调用的包都需要在module-info.java
中用exports
语句申明exports 包名
- 一个
- 使用
requires
来申明依赖的外部模块,可以有多个requires
语句- 一个
module
中需要调用外部模块都需要在module-info.java
中用requires
语句申明requires 模块名
- 一个
JDK10新特性
var局部变量推导
使用var基本要求
- 必须能够推导出实际类型
- 只能用于局部变量
该特性一般不推荐使用
1 | public class Test { |
JDK11新特性
单文件程序
以前运行.java
文件需要:
javac xxx.java
编译得到对应的字节码文件xxx.class
java xxx.class
运行对应java程序
新特性只需:java xxx.java
即可运行
1 | package com.test2; |
shebang脚本
#!
符号叫做shebang
,音译为释伴,即解释伴随行#!/bin/bash
,以此开头的文件,在执行时会实际调用/bin/bash
程序来执行
编写一个非Java文件,文件首行添加shebang语句,在git bash
中可以直接执行
1 | #!D:\ProgramTools\java_tools\JDK17\bin\java --source 11 |
该功能应用场景:用Java语言编写脚本
JDK14新特性
文本块
多行字符串:比如json
、html
、sql
等
1 | public class Test2 { |
instanceof增强
1 | public class Test { |
空指针提示
可以提示空指针异常具体产生的位置和原因
下面代码在两个不同JDK
版本运行结果
1 | public class Test { |
JDK8版本
JDK14版本
JDK16新特性
record类
- record是一个final类,初始化后就不能修改属性值
- 自动生成toString, hashCode, equals方法
- 一般应用场景:数据类,比如
MVC
机构中的DTO
、VO
、PO
等
1 | package com.test1; |
JDK17新特性
sealed类
背景:类的继承很难管理,使用sealed
可以显示管理
- 父类如果是
sealed
类,则其必须至少有一个子类 sealed
类的子类,必须是final
、sealed
、non-sealed
之一
其实实际上没多大用处,只是在如果一个类需要继承其他类,或者一个类需要被其他子类继承,需要强制申明一些关键字,在一定程度上可以避免继承的泛滥
Switch增强
其实没啥用
下面举个例子简单介绍一下
1 | public class Switch { |
SpringBoot3新特性
AOT与JIT介绍
JIT(Just-in-Time,实时编译)
AOT(Ahead-of-Time,预编译或提前编译)
AOT的优势
- 启动和运行速度快
- 传统
SpringBoot
空项目启动时间大概是2秒,AOT
的启动时间大概是100毫秒
- 传统
- 打包体积小
AOT的缺点
- 编译后的程序不支持跨平台
- 不支持动态功能,比如AOP
AOP在正常项目一般用不到,其主要特点是可以将项目打包成exe的模式,在单机应用中可以直接运行,而无需另外的JDK环境
JIT在高并发场景中的生产问题
生产问题现象:热点应用重启后,出现业务超时,几分钟后恢复正常,所谓的热点应用只有在并发量超过一定阈值之后才会出现
原因:
解决办法:
预热:初始让程序自动运行热点代码几百次
流量控制:启动时小流量,运行几分钟后再放到正常流量
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bang's Blog!