diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..7d05e99
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,10 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# 依赖于环境的 Maven 主目录路径
+/mavenHomeManager.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/AugmentWebviewStateStore.xml b/.idea/AugmentWebviewStateStore.xml
new file mode 100644
index 0000000..20eae4a
--- /dev/null
+++ b/.idea/AugmentWebviewStateStore.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/JavaHome.iml b/.idea/JavaHome.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/JavaHome.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..ee9f695
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..31e1ebc
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..f8fcfea
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..8306744
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java10\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java10\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..25c959b
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java10\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,60 @@
+# Java 10 新特性
+
+Java 10 于 2018 年 3 月发布,是 Java 采用新的、更快的半年发布周期后的第一个版本。它带来了一些实用的新功能,其中最著名的是局部变量类型推断。
+
+## 1. 局部变量类型推断 (Local-Variable Type Inference)
+
+这是 Java 10 最核心的特性。通过使用 `var` 关键字,可以让编译器推断出局部变量的类型,从而简化代码。
+
+- **目的**:减少样板代码,提高代码的可读性。
+- **注意**:`var` 只能用于局部变量(方法内、循环中等),不能用于成员变量、方法参数或返回类型。
+
+**使用前:**
+```java
+String message = "Hello, Java 10!";
+ArrayList list = new ArrayList();
+```
+
+**使用后:**
+```java
+var message = "Hello, Java 10!"; // 推断为 String
+var list = new ArrayList(); // 推断为 ArrayList
+
+for (var item : list) {
+ System.out.println(item); // item 推断为 String
+}
+```
+
+## 2. 不可变集合的增强
+
+`List`, `Set`, `Map` 接口新增了 `copyOf`静态方法,用于创建一个不可修改的集合副本。
+
+```java
+var originalList = new ArrayList();
+originalList.add("a");
+originalList.add("b");
+
+// 创建一个不可修改的副本
+var copy = List.copyOf(originalList);
+
+// 尝试修改副本会导致 UnsupportedOperationException
+// copy.add("c");
+```
+
+## 3. `Optional` 的 `orElseThrow()` 方法
+
+`Optional` 类新增了 `orElseThrow()` 方法。当 `Optional` 为空时,它会抛出 `NoSuchElementException`。这与 `get()` 方法的行为完全相同,但方法名更能体现其作用。
+
+```java
+// 如果 Optional 为空,则抛出 NoSuchElementException
+var value = optional.orElseThrow();
+```
+
+## 4. 垃圾收集器 (GC) 改进
+
+- **G1 垃圾收集器的并行 Full GC**:在之前的版本中,G1 的 Full GC 是单线程的,可能导致较长的停顿。Java 10 将其改为了多线程,从而减少了最坏情况下的停顿时间。
+- **垃圾收集器接口 (GC Interface)**:引入了一个干净的 GC 接口,使得在 JVM 中集成新的垃圾收集器变得更加容易。
+
+## 5. 应用类数据共享 (Application Class-Data Sharing)
+
+扩展了现有的类数据共享(CDS)功能,允许将应用程序的类也包含在共享归档中。这可以减少多个 JVM 实例之间的内存占用,并缩短启动时间。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java11\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java11\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..90ce0bb
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java11\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,100 @@
+# Java 11 (LTS) 新特性
+
+Java 11 于 2018 年 9 月发布,是一个长期支持(LTS)版本。它带来了许多实用的 API 增强和一些重要的平台更新。
+
+## 1. 标准化的 HTTP Client API
+
+在 Java 9 和 10 中作为孵化功能的 HTTP Client API,在 Java 11 中被正式标准化。它位于 `java.net.http` 包中,提供了对 HTTP/1.1 和 HTTP/2 的支持,并完全取代了旧的 `HttpURLConnection`。
+
+- **核心类**:`HttpClient`, `HttpRequest`, `HttpResponse`。
+- **特点**:支持同步和异步操作,使用 `CompletableFuture` 处理异步请求。
+
+**示例:发送一个 GET 请求**
+```java
+var client = HttpClient.newHttpClient();
+var request = HttpRequest.newBuilder()
+ .uri(URI.create("https://api.github.com/"))
+ .build();
+
+// 异步方式
+client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
+ .thenApply(HttpResponse::body)
+ .thenAccept(System.out::println)
+ .join();
+
+// 同步方式
+// HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+// System.out.println(response.body());
+```
+
+## 2. String 类的增强
+
+`String` 类增加了几个非常方便的新方法:
+
+- **`isBlank()`**: 判断字符串是否为空白(只包含空格、制表符等)。
+- **`lines()`**: 将字符串按行分隔符转换为一个 `Stream`。
+- **`strip()`**, **`stripLeading()`**, **`stripTrailing()`**: 去除字符串首尾或单边的空白字符,功能比 `trim()` 更强大,能识别 Unicode 空白字符。
+- **`repeat(int)`**: 将字符串重复指定的次数。
+
+```java
+// isBlank
+System.out.println(" \t ".isBlank()); // true
+
+// lines
+"Hello\nWorld".lines().forEach(System.out::println);
+
+// strip
+String s = "\u2005 Hello \u2005"; // \u2005 是一个 Unicode 空白符
+System.out.println("'" + s.trim() + "'"); // ' Hello '
+System.out.println("'" + s.strip() + "'"); // 'Hello'
+
+// repeat
+System.out.println("Java ".repeat(3)); // "Java Java Java "
+```
+
+## 3. 直接运行单个 Java 源文件
+
+从 Java 11 开始,你可以直接使用 `java` 命令来运行一个单个的 `.java` 源文件,无需先手动使用 `javac` 编译。
+
+```bash
+# 创建一个 HelloWorld.java 文件
+# public class HelloWorld {
+# public static void main(String[] args) {
+# System.out.println("Hello, Java 11!");
+# }
+# }
+
+# 直接运行
+$ java HelloWorld.java
+Hello, Java 11!
+```
+
+## 4. Lambda 参数的局部变量类型推断
+
+`var` 关键字现在可以用于 Lambda 表达式的参数声明中。这在需要给参数添加注解时非常有用。
+
+```java
+// Java 10 中不允许
+// (var x, var y) -> x.process(y)
+
+// Java 11 中允许
+Predicate predicate = (@Nonnull var s) -> s.length() > 0;
+```
+
+## 5. 文件读写 API 增强
+
+`java.nio.file.Files` 类增加了 `writeString()` 和 `readString()` 方法,可以更方便地读写文件内容。
+
+```java
+Path path = Files.writeString(Files.createTempFile("test", ".txt"), "Hello, world!");
+String content = Files.readString(path);
+System.out.println(content); // Hello, world!
+```
+
+## 6. ZGC (Z Garbage Collector)
+
+引入了 ZGC,这是一个可伸缩的、低延迟的垃圾收集器,作为一项实验性功能。它的设计目标是将 GC 停顿时间控制在 10ms 以内,即使是对于非常大的堆(TB 级别)。
+
+## 7. 移除 Java EE 和 CORBA 模块
+
+Java 11 从 JDK 中移除了过去被废弃的 Java EE 和 CORBA 模块(例如 `java.xml.ws`, `java.corba`)。如果你的应用需要这些模块,必须从外部库(如 Maven Central)中添加依赖。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java12\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java12\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..bbd32ae
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java12\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,91 @@
+# Java 12 新特性
+
+Java 12 于 2019 年 3 月发布。它引入了一些预览功能和 API 增强,其中最受关注的是 Switch 表达式的预览。
+
+## 1. Switch 表达式 (Switch Expressions - 预览功能)
+
+Java 12 首次引入了 Switch 表达式作为预览功能,极大地增强了 `switch` 语句的能力。
+
+- **目的**:简化 `switch` 结构,使其可以作为表达式返回值,避免了繁琐的 `break` 和临时变量。
+- **新语法**:使用 `case L -> ...` 标签,无需 `break`,并且可以保证穷尽所有可能的情况。
+
+**传统 `switch` 语句:**
+```java
+String dayName;
+switch (day) {
+ case MONDAY:
+ case FRIDAY:
+ case SUNDAY:
+ dayName = "Work Day";
+ break;
+ case TUESDAY:
+ dayName = "Rest Day";
+ break;
+ default:
+ dayName = "Unknown";
+}
+```
+
+**使用 Switch 表达式 (Java 12 预览版):**
+```java
+String dayName = switch (day) {
+ case MONDAY, FRIDAY, SUNDAY -> "Work Day";
+ case TUESDAY -> "Rest Day";
+ default -> "Unknown";
+};
+```
+
+## 2. Shenandoah: 低暂停时间的垃圾收集器 (实验性)
+
+引入了一个新的垃圾收集器 Shenandoah,其主要目标是通过与正在运行的 Java 线程同时执行更多的 GC 工作来减少 GC 暂停时间。这对于需要低延迟和高响应性的应用程序特别有价值。
+
+## 3. `String` 类的新方法
+
+`String` 类增加了两个有用的方法:`indent()` 和 `transform()`。
+
+- **`indent(int n)`**: 对字符串进行缩进。如果 `n` > 0,则在每行开头添加 `n` 个空格;如果 `n` < 0,则尝试从每行开头删除最多 `|n|` 个空格。
+- **`transform(Function)`**: 将一个函数应用于字符串,可以方便地进行链式转换。
+
+```java
+// indent
+String text = "Hello\nWorld";
+System.out.println(text.indent(2));
+// 输出:
+// Hello
+// World
+
+// transform
+String result = "12345".transform(s -> new StringBuilder(s).reverse().toString());
+System.out.println(result); // "54321"
+```
+
+## 4. `Files.mismatch()` 方法
+
+`java.nio.file.Files` 中添加了 `mismatch()` 方法,用于比较两个文件的内容是否相同。它会返回第一个不匹配字节的位置,如果文件内容完全相同,则返回 -1L。
+
+```java
+Path path1 = Files.createTempFile("file1", ".txt");
+Path path2 = Files.createTempFile("file2", ".txt");
+Files.writeString(path1, "Java 12");
+Files.writeString(path2, "Java 12");
+
+long mismatch = Files.mismatch(path1, path2);
+System.out.println(mismatch); // -1 (文件内容相同)
+```
+
+## 5. Teeing Collector
+
+Stream API 增加了一个新的收集器 `Collectors.teeing()`。它可以将一个流的元素同时传递给两个下游收集器,然后将它们的结果合并成一个最终结果。
+
+**示例:计算平均值**
+```java
+// 计算流中数字的总和和计数,然后计算平均值
+double average = Stream.of(1, 2, 3, 4, 5)
+ .collect(Collectors.teeing(
+ Collectors.summingDouble(i -> i), // 第一个收集器:求和
+ Collectors.counting(), // 第二个收集器:计数
+ (sum, count) -> sum / count // 合并函数
+ ));
+
+System.out.println(average); // 3.0
+```
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java13\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java13\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..1bb3730
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java13\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,63 @@
+# Java 13 新特性
+
+Java 13 于 2019 年 9 月发布。此版本对 Java 12 引入的一些预览功能进行了改进,并重新实现了一些底层 API。
+
+## 1. 文本块 (Text Blocks - 预览功能)
+
+Java 13 引入了文本块作为一项预览功能,旨在简化多行字符串的编写。
+
+- **目的**:避免在字符串中大量使用转义字符(如 `\n`),使 SQL、JSON、HTML 等嵌入代码更易于读写。
+- **语法**:使用三个双引号 `"""` 作为开始和结束分隔符。
+
+**传统方式:**
+```java
+String html = "\n" +
+ " \n" +
+ " Hello, World
\n" +
+ " \n" +
+ "\n";
+```
+
+**使用文本块:**
+```java
+String html = """
+
+
+ Hello, World
+
+
+ """;
+```
+
+## 2. Switch 表达式增强 (预览功能)
+
+Java 12 的 Switch 表达式在 Java 13 中得到了改进。最主要的变化是引入了 `yield` 关键字,用于从 `switch` 表达式中返回一个值,以替代之前的 `break` 用法。
+
+```java
+String text = switch (day) {
+ case MONDAY:
+ case FRIDAY:
+ case SUNDAY:
+ yield "Work Day";
+ case TUESDAY:
+ yield "Rest Day";
+ default:
+ yield "Unknown";
+};
+```
+
+**注意**:在 Java 14 中,`yield` 被最终确定下来,而 `break` 的返回值方式被移除。
+
+## 3. 重新实现旧版 Socket API
+
+`java.net.Socket` 和 `java.net.ServerSocket` 的底层实现被替换为一个更现代化、更易于维护和调试的实现。这个变化对开发者是透明的,旧的代码无需修改即可运行。
+
+- **目的**:消除历史遗留的技术债,为未来的网络编程(如 Project Loom 的虚拟线程)提供更好的基础。
+
+## 4. ZGC: 取消提交未使用的内存
+
+ZGC 垃圾收集器得到了增强,现在可以将未使用的堆内存返还给操作系统。这对于需要关心内存占用的云原生和容器化环境非常有用。
+
+## 5. 动态 CDS 归档 (Dynamic CDS Archives)
+
+在 Java 10 引入的应用类数据共享(AppCDS)基础上进行了扩展。现在,可以在应用程序执行结束时动态生成共享归档,简化了 AppCDS 的使用流程。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java14\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java14\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..4005139
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java14\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,107 @@
+# Java 14 新特性
+
+Java 14 于 2020 年 3 月发布。此版本将之前的一些预览功能转正,并引入了像 Records 这样的重量级新预览功能。
+
+## 1. Switch 表达式 (标准版)
+
+在经过 Java 12 和 13 两轮预览后,Switch 表达式在 Java 14 中被正式确定下来。
+
+- **最终语法**:使用 `case L -> ...` 的箭头语法,或者在代码块中使用 `yield` 关键字返回值。
+
+```java
+int numLetters = switch (day) {
+ case MONDAY, FRIDAY, SUNDAY -> 6;
+ case TUESDAY -> 7;
+ case THURSDAY, SATURDAY -> 8;
+ case WEDNESDAY -> 9;
+ default -> {
+ System.out.println("Invalid day");
+ yield 0;
+ }
+};
+```
+
+## 2. Records (预览功能)
+
+Java 14 引入了 `record` 关键字作为预览功能,旨在创建不可变的数据聚合类(Data Carrier)。
+
+- **目的**:极大地减少创建 POJO (Plain Old Java Object) 所需的样板代码。
+- **自动生成**:编译器会自动为 `record` 生成构造函数、`equals()`, `hashCode()`, `toString()` 以及字段的 `getter` 方法。
+
+**传统方式:**
+```java
+// 需要手动编写构造函数、getter、equals、hashCode、toString
+class Point {
+ private final int x;
+ private final int y;
+ // ... 大量样板代码
+}
+```
+
+**使用 Record:**
+```java
+// 一行代码即可
+public record Point(int x, int y) {}
+
+// 使用
+var point = new Point(1, 2);
+System.out.println(point.x()); // 访问器方法,不是 getX()
+System.out.println(point); // Point[x=1, y=2]
+```
+
+## 3. 更实用的 NullPointerExceptions
+
+JVM 改进了 `NullPointerException` 的提示信息,可以精确地指出哪个变量是 `null`,极大地提高了调试效率。
+
+**示例代码:**
+```java
+a.b.c.doSomething();
+```
+
+**Java 14 之前的异常信息:**
+```
+Exception in thread "main" java.lang.NullPointerException
+ at MyClass.main(MyClass.java:10)
+```
+
+**Java 14 之后的异常信息:**
+```
+Exception in thread "main" java.lang.NullPointerException:
+ Cannot read field "c" because "a.b" is null
+ at MyClass.main(MyClass.java:10)
+```
+
+## 4. instanceof 的模式匹配 (预览功能)
+
+简化了 `instanceof` 的使用,允许在检查类型的同时声明一个绑定变量,避免了显式的类型转换。
+
+**传统方式:**
+```java
+if (obj instanceof String) {
+ String s = (String) obj;
+ System.out.println(s.toUpperCase());
+}
+```
+
+**使用模式匹配:**
+```java
+if (obj instanceof String s) { // s 在 if 块内可用
+ System.out.println(s.toUpperCase());
+}
+```
+
+## 5. 文本块功能增强
+
+文本块(在 Java 13 中预览)增加了两个新的转义序列:
+
+- **`\` (反斜杠)**:用于在行尾取消换行符,可以将多行写成一行。
+- **`\s`**: 表示一个单个的空格。
+
+```java
+String text = """
+ line 1 \
+ line 2 \
+ line 3
+ """;
+// 实际内容是 "line 1 line 2 line 3"
+```
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java15\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java15\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..d798292
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java15\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,68 @@
+# Java 15 新特性
+
+Java 15 于 2020 年 9 月发布。它带来了新的预览功能,如密封类,并让一些重要的功能(如 ZGC)进入了生产就绪阶段。
+
+## 1. 密封类 (Sealed Classes - 预览功能)
+
+密封类和接口用于限制哪些其他类或接口可以扩展或实现它们。
+
+- **目的**:为类库作者提供更精细的控制,允许对类层次结构进行建模,这在模式匹配中特别有用。
+- **关键字**:`sealed`, `permits`, `non-sealed`。
+
+**示例:**
+```java
+// Shape 接口只允许 Circle 和 Square 实现
+public sealed interface Shape permits Circle, Square {
+ double area();
+}
+
+// final class, 终止继承
+public final class Circle implements Shape {
+ public final double radius;
+ public Circle(double radius) { this.radius = radius; }
+ public double area() { return Math.PI * radius * radius; }
+}
+
+// non-sealed class, 允许任何类继承它
+public non-sealed class Square implements Shape {
+ public final double side;
+ public Square(double side) { this.side = side; }
+ public double area() { return side * side; }
+}
+
+// 由于 Square 是 non-sealed, 任何类都可以继承它
+public class SpecialSquare extends Square {
+ public SpecialSquare(double side) { super(side); }
+}
+```
+
+## 2. Records (第二次预览) & instanceof 模式匹配 (第二次预览)
+
+在 Java 14 中引入的 Records 和 `instanceof` 模式匹配在 Java 15 中进入了第二次预览。它们的功能基本保持不变,主要是根据社区反馈进行了一些微调,为最终定稿做准备。
+
+## 3. 文本块 (标准版)
+
+经过两轮预览,文本块在 Java 15 中被正式确定下来,成为标准功能。现在可以放心在生产代码中使用多行字符串了。
+
+```java
+String json = """
+ {
+ "name": "John Doe",
+ "age": 30
+ }
+ """;
+```
+
+## 4. ZGC 和 Shenandoah 垃圾收集器 (生产就绪)
+
+在之前版本中作为实验性或预览功能的 ZGC 和 Shenandoah 低延迟垃圾收集器,在 Java 15 中被标记为生产就绪(Production Ready)。这意味着它们已经足够稳定,可以在生产环境中使用。
+
+## 5. 隐藏类 (Hidden Classes)
+
+这是一个主要面向框架和工具开发者的功能。隐藏类是一种不能被其他类的字节码直接使用的类。它们只能通过反射被发现和使用。
+
+- **目的**:允许框架在运行时生成和加载类,而不会污染应用程序的类命名空间,并且可以独立卸载,从而减少内存占用。
+
+## 6. 移除 Nashorn JavaScript 引擎
+
+在 Java 11 中被标记为废弃的 Nashorn JavaScript 引擎及其相关 API,在 Java 15 中被正式移除。如果需要,可以考虑使用 GraalVM 等替代方案。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java16\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java16\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..7113efd
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java16\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,57 @@
+# Java 16 新特性
+
+Java 16 于 2021 年 3 月发布。此版本将 Java 14 和 15 中广受欢迎的几个预览功能(如 Records 和模式匹配)正式确定下来。
+
+## 1. Records (标准版)
+
+经过两轮预览,Records 在 Java 16 中被正式确定下来。现在,你可以放心地在生产代码中使用 `record` 来定义不可变的数据载体类,从而极大地减少样板代码。
+
+```java
+// Records 已成为标准功能
+public record Point(int x, int y) {}
+```
+
+## 2. instanceof 的模式匹配 (标准版)
+
+`instanceof` 的模式匹配也在此版本中被正式确定下来。这使得类型检查和转换的代码更加简洁和安全。
+
+```java
+// 模式匹配已成为标准功能
+Object obj = "Hello, Java 16";
+if (obj instanceof String s) {
+ // s可以直接使用,无需强制转换
+ System.out.println(s.length());
+}
+```
+
+## 3. 密封类 (第二次预览)
+
+密封类(Sealed Classes)在 Java 16 中进入了第二次预览。根据社区的反馈进行了一些改进,例如放宽了对 `sealed` 类所在包的限制。
+
+## 4. Vector API (孵化器)
+
+引入了一个新的 Vector API 作为孵化功能。这个 API 旨在提供一种表达向量计算的方式,这些计算在运行时可以可靠地编译为 CPU 架构上的最佳向量指令(如 SIMD 指令),从而获得优于等效标量计算的性能。
+
+```java
+// 示例:使用 Vector API 对两个数组进行求和
+// int[] a = { ... };
+// int[] b = { ... };
+// int[] c = new int[a.length];
+// var SPECIES = IntVector.SPECIES_PREFERRED;
+//
+// for (int i = 0; i < a.length; i += SPECIES.length()) {
+// var mask = SPECIES.indexInRange(i, a.length);
+// var va = IntVector.fromArray(SPECIES, a, i, mask);
+// var vb = IntVector.fromArray(SPECIES, b, i, mask);
+// var vc = va.add(vb);
+// vc.intoArray(c, i, mask);
+// }
+```
+
+## 5. 默认启用 C++14 语言特性
+
+在 JVM 的 C++ 源代码中,现在可以使用 C++14 版本的语言特性。这对 Java 开发者是透明的,但有助于 JVM 开发人员利用更现代的 C++ 特性来改进和维护 JVM。
+
+## 6. 将 JDK 移植到 Alpine Linux
+
+JDK 被成功移植到使用 musl 作为主要 C 库的 Alpine Linux 以及其他 Linux 发行版上。这对于构建轻量级容器镜像非常重要,因为 Alpine Linux 是容器化环境中的热门选择。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java17\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java17\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..0388b7d
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java17\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,64 @@
+# Java 17 (LTS) 新特性
+
+Java 17 于 2021 年 9 月发布,是继 Java 11 之后的又一个长期支持(LTS)版本。它将一些重要的预览功能(如密封类)转正,并带来了对未来 Java 编程风格有深远影响的新预览功能。
+
+## 1. 密封类 (Sealed Classes - 标准版)
+
+经过两轮预览,密封类在 Java 17 中被正式确定下来。它允许库作者精确控制哪些类可以继承或实现一个 `sealed` 的类或接口,这对于构建安全的、可预测的 API 非常重要。
+
+```java
+// Sealed Classes 已成为标准功能
+public sealed interface Shape permits Circle, Rectangle {}
+
+public final class Circle implements Shape {}
+public final class Rectangle implements Shape {}
+```
+
+## 2. Switch 的模式匹配 (预览功能)
+
+这是 Java 17 中最令人兴奋的预览功能。它极大地增强了 `switch` 语句,使其可以对类型进行匹配,并安全地执行类型转换。
+
+- **目的**:简化复杂的、基于类型的条件判断,使代码更具可读性和安全性。
+
+**传统方式:**
+```java
+static double getArea(Shape shape) {
+ if (shape instanceof Circle c) {
+ return Math.PI * c.radius() * c.radius();
+ } else if (shape instanceof Rectangle r) {
+ return r.length() * r.width();
+ } else {
+ throw new IllegalArgumentException("Unknown shape");
+ }
+}
+```
+
+**使用 Switch 模式匹配:**
+```java
+static double getArea(Shape shape) {
+ return switch (shape) {
+ // case 后面直接跟类型和变量名
+ case Circle c -> Math.PI * c.radius() * c.radius();
+ case Rectangle r -> r.length() * r.width();
+ // default 分支处理其他情况
+ default -> throw new IllegalArgumentException("Unknown shape
+");
+ };
+}
+```
+
+## 3. 外部函数和内存 API (孵化器)
+
+引入了一个新的 API,旨在替代老旧且脆弱的 JNI (Java Native Interface)。这个 API 提供了一种更安全、更高效的方式来调用 Java 运行时之外的本地代码(如 C 库)和操作本地内存。
+
+## 4. 强封装 JDK 内部 API
+
+从 Java 9 开始,JDK 就试图限制对内部 API 的访问。在 Java 17 中,这一限制变得更加严格。默认情况下,无法再通过反射等“黑客”手段访问 JDK 的内部模块,除非通过特定的命令行参数显式授权。这有助于提高平台的安全性和可维护性。
+
+## 5. 移除 RMI 激活机制
+
+远程方法调用(RMI)的激活机制(Activation)是一个过时且很少使用的功能,已在此版本中被正式移除。
+
+## 6. 废弃 Applet API
+
+古老的 Applet API 在此版本中被正式标记为“废弃,并准备在未来移除”。这标志着 Applet 技术时代的终结。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java18\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java18\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..d8f22c5
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java18\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,49 @@
+# Java 18 新特性
+
+Java 18 于 2022 年 3 月发布。此版本带来了一个非常实用的开箱即用工具,并继续推进了多个重要的孵化和预览功能。
+
+## 1. 默认编码为 UTF-8
+
+这是一个重要的全局性变更。从 Java 18 开始,所有标准的 Java API 都将默认使用 UTF-8 编码,而不再依赖于操作系统、用户语言环境等外部因素。这解决了长期以来困扰开发者的编码不一致问题,大大提高了跨平台开发的可靠性。
+
+## 2. 简单的 Web 服务器
+
+JDK 内置了一个开箱即用的、最小化的静态 HTTP 文件服务器。它不是为了在生产环境替代 Tomcat、Jetty 等服务器,而是为了在开发、测试和教学场景中快速启动一个服务来共享文件。
+
+**启动一个服务器:**
+```bash
+# 在你的项目目录下运行
+# 默认监听 8000 端口
+$ jwebserver
+
+# 也可以指定端口和目录
+$ jwebserver -p 8080 -d /path/to/files
+```
+
+## 3. Java API 文档中的代码片段
+
+这是一个针对文档工具 (Javadoc) 的改进。现在可以使用 `@snippet` 标签在 API 文档中包含更丰富、更健壮的示例代码。这使得示例代码更容易被验证、高亮和维护。
+
+## 4. Switch 的模式匹配 (第二次预览)
+
+Java 17 引入的 Switch 模式匹配在此版本中进入了第二次预览。主要根据社区反馈进行了一些改进,例如在处理 `null` 情况时更加完善。
+
+```java
+static String formatter(Object o) {
+ return switch (o) {
+ case Integer i -> String.format("int %d", i);
+ case Long l -> String.format("long %d", l);
+ // ...
+ case null -> "null"; // 可以直接处理 null case
+ default -> o.toString();
+ };
+}
+```
+
+## 5. 外部函数和内存 API (第二次孵化)
+
+这个旨在替代 JNI 的 API 在此版本中进入了第二次孵化,API 设计上有了显著的改进,使其更加易用和强大。
+
+## 6. Vector API (第三次孵化)
+
+用于高性能向量计算的 Vector API 也进入了第三次孵化阶段,继续根据反馈进行完善。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java19\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java19\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..3ad93aa
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java19\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,74 @@
+# Java 19 新特性
+
+Java 19 于 2022 年 9 月发布。此版本带来了 Java 平台一个里程碑式的预览功能:虚拟线程(Virtual Threads),它有望彻底改变 Java 的并发编程模型。
+
+## 1. 虚拟线程 (Virtual Threads - 预览功能)
+
+虚拟线程是 Project Loom 的核心成果。它是一种轻量级的线程,由 JVM 管理,而不是直接映射到操作系统线程。
+
+- **目的**:极大地提高高吞吐量并发应用程序的性能和可伸缩性。开发者可以用传统的“一个请求一个线程”的同步阻塞式代码,来达到异步非阻塞代码的性能。
+- **特点**:创建成本极低,可以轻松创建数百万个虚拟线程。
+
+**创建和使用虚拟线程:**
+```java
+// 直接创建并启动
+Thread.startVirtualThread(() -> {
+ System.out.println("Hello from a virtual thread!");
+});
+
+// 使用 Executors 创建
+try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
+ Future> future = executor.submit(() -> System.out.println("Running in a virtual thread"));
+ future.get();
+}
+```
+
+## 2. 结构化并发 (Structured Concurrency - 孵化功能)
+
+这是一个新的并发编程模型,旨在简化多线程错误处理和任务协调。它将并发任务的生命周期视为一个单元,如果一个子任务失败,整个任务组可以被可靠地取消。
+
+```java
+// 示例:使用 StructuredTaskScope
+// try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
+// Future user = scope.fork(() -> findUser());
+// Future order = scope.fork(() -> fetchOrder());
+//
+// scope.join(); // 等待所有子任务完成
+// scope.throwIfFailed(); // 如果有任何子任务失败,则抛出异常
+//
+// // 两个任务都成功后,处理结果
+// String userInfo = user.resultNow();
+// int orderInfo = order.resultNow();
+// // ...
+// }
+```
+
+## 3. Record 模式 (Record Patterns - 预览功能)
+
+扩展了模式匹配,使其可以用于解构 `record` 类型。这在 `instanceof` 和 `switch` 语句中非常有用。
+
+**使用 Record 模式:**
+```java
+public record Point(int x, int y) {}
+
+static void printSum(Object obj) {
+ // 检查 obj 是否是 Point,如果是,则将其 x 和 y 解构到变量 ix 和 iy
+ if (obj instanceof Point(int ix, int iy)) {
+ System.out.println(ix + iy);
+ }
+}
+
+// 也可以与 switch 模式匹配结合使用
+// switch (obj) {
+// case Point(int x, int y) -> System.out.printf("Point at %d, %d%n", x, y);
+// ...
+// }
+```
+
+## 4. Switch 的模式匹配 (第三次预览)
+
+Switch 模式匹配在此版本中进入了第三次预览,继续根据反馈进行改进,例如增加了对 `when` 子句的支持,用于更复杂的条件判断。
+
+## 5. 外部函数和内存 API (第二次预览)
+
+此 API 在 Java 19 中进入了第二次预览阶段(注意:Java 18 是第二次孵化,Java 19 是第二次预览),API 设计更加精炼,朝着最终定稿又迈进了一步。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java20\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java20\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..d2b5513
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java20\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,41 @@
+# Java 20 新特性
+
+Java 20 于 2023 年 3 月发布。此版本的主要工作是继续推进和完善在 Java 19 中引入的多个重要预览和孵化功能。
+
+## 1. 虚拟线程 (Virtual Threads - 第二次预览)
+
+虚拟线程在此版本中进入了第二次预览。API 方面没有重大变化,主要是根据社区反馈进行了一些小的改进和错误修复,使其更加稳定和可靠。
+
+## 2. 结构化并发 (Structured Concurrency - 第二次孵化)
+
+结构化并发在此版本中进入了第二次孵化。一个重要的变化是 `StructuredTaskScope` 进行了更新,可以支持在任务作用域内跨线程继承作用域值(Scoped Values),这对于在并发任务之间传递上下文信息非常有用。
+
+## 3. 作用域值 (Scoped Values - 孵化功能)
+
+这是一个新的孵化功能,旨在提供一种在线程内部以及线程之间共享不可变数据的现代化方法,尤其是在使用虚拟线程时。
+
+- **目的**:替代 `ThreadLocal`,特别是在虚拟线程场景下。`ThreadLocal` 在虚拟线程环境下存在一些问题(如内存泄漏风险、数据继承成本高)。
+- **特点**:数据是不可变的,并且只在特定的代码作用域内有效,可以安全地跨线程传递。
+
+```java
+// public final static ScopedValue LOGGED_IN_USER = ScopedValue.newInstance();
+//
+// // 在一个作用域内设置值
+// ScopedValue.where(LOGGED_IN_USER, currentUser)
+// .run(() -> {
+// // 在这里,LOGGED_IN_USER.get() 会返回 currentUser
+// processRequest();
+// });
+```
+
+## 4. Record 模式 (Record Patterns - 第二次预览)
+
+Record 模式也进入了第二次预览。此版本的一个主要改进是允许在 Record 模式中进行类型参数的推断,并支持与 `for` 循环等语句结合使用。
+
+## 5. Switch 的模式匹配 (第四次预览)
+
+Switch 的模式匹配在此版本中进入了第四次预览,API 已经非常稳定,主要进行了一些语法上的微调和对泛型模式匹配的增强,为在下一个 LTS 版本中最终定稿做好了准备。
+
+## 6. 外部函数和内存 API (第二次预览)
+
+这个旨在替代 JNI 的 API 也进入了第二次预览,API 更加精炼,并统一了 `MemorySegment` 和 `MemoryAddress` 的接口,使其更易于使用。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java21\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java21\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..fd08ead
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java21\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,103 @@
+# Java 21 (LTS) 新特性
+
+Java 21 于 2023 年 9 月发布,是继 Java 17 之后的最新一个长期支持(LTS)版本。它正式确定了虚拟线程、记录模式、Switch 模式匹配等一系列里程碑式的功能,标志着现代 Java 开发进入了一个新阶段。
+
+## 1. 虚拟线程 (Virtual Threads - 标准版)
+
+经过两轮预览,虚拟线程在 Java 21 中被正式确定下来。开发者现在可以在生产环境中大规模使用轻量级线程,用同步的方式写出高并发、高吞吐量的应用程序,而无需复杂的异步编程。
+
+```java
+// 虚拟线程已成为标准功能
+try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
+ for (int i = 0; i < 10_000; i++) {
+ executor.submit(() -> {
+ Thread.sleep(Duration.ofSeconds(1));
+ return i;
+ });
+ }
+} // executor.close() 会隐式地等待所有任务完成
+```
+
+## 2. 记录模式 (Record Patterns - 标准版)
+
+记录模式也在此版本中被正式确定下来。它允许在 `instanceof` 和 `switch` 中对 `record` 进行解构,使代码更加简洁和富有表现力。
+
+```java
+public record Point(int x, int y) {}
+
+// 记录模式已成为标准功能
+static void printSum(Object obj) {
+ if (obj instanceof Point(int x, int y)) {
+ System.out.println(x + y);
+ }
+}
+```
+
+## 3. Switch 的模式匹配 (标准版)
+
+经过多轮预览,Switch 的模式匹配终于在 Java 21 中转正。它极大地增强了 `switch` 的能力,使其可以根据类型和 `record` 结构进行分支判断,并支持 `when` 子句进行更精细的控制。
+
+```java
+// Switch 模式匹配已成为标准功能
+static String formatter(Object o) {
+ return switch (o) {
+ case Integer i -> String.format("int %d", i);
+ case Long l -> String.format("long %d", l);
+ case Double d -> String.format("double %f", d);
+ case String s -> String.format("String %s", s);
+ case Point(int x, int y) -> String.format("Point at %d, %d", x, y);
+ default -> o.toString();
+ };
+}
+```
+
+## 4. 序列化集合 (Sequenced Collections)
+
+引入了一套新的集合接口,用于表示具有确定出现顺序的集合。`List` 和 `Deque` 等都实现了新的 `SequencedCollection` 接口。
+
+- **核心接口**:`SequencedCollection`, `SequencedSet`, `SequencedMap`。
+- **新方法**:提供了如 `getFirst()`, `getLast()`, `addFirst()`, `addLast()`, `reversed()` 等统一的 API。
+
+```java
+List list = new ArrayList<>();
+list.add("A");
+list.add("B");
+
+// 新 API
+System.out.println(list.getFirst()); // A
+System.out.println(list.getLast()); // B
+
+// 获取一个反向视图
+List reversedList = list.reversed();
+System.out.println(reversedList); // [B, A]
+```
+
+## 5. 字符串模板 (String Templates - 预览功能)
+
+这是一个新的预览功能,旨在简化包含运行时表达式的字符串的编写,比传统的字符串拼接或 `String.format()` 更安全、更强大。
+
+```java
+// 使用 STR 模板处理器
+String name = "Joan";
+String info = STR."My name is \{name}";
+System.out.println(info); // My name is Joan
+```
+
+## 6. 未命名模式和变量 (Unnamed Patterns and Variables - 预览功能)
+
+允许使用下划线 `_` 来表示未使用的模式变量或局部变量,以减少代码冗余。
+
+```java
+// 忽略 record 模式中的某个组件
+// if (obj instanceof Point(int x, int _)) { ... }
+
+// 忽略 switch case 中的变量
+// case Point(int x, int _) -> ...
+
+// 忽略 try-with-resources 中的资源变量
+// try (var _ = ScopedValue.where(...)) { ... }
+```
+
+## 7. 结构化并发 (Structured Concurrency - 预览功能) & 作用域值 (Scoped Values - 预览功能)
+
+这两个在之前版本中孵化的功能,在 Java 21 中都进入了预览阶段,API 更加成熟,离最终定稿更近一步。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java9\346\226\260\347\211\271\346\200\247.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java9\346\226\260\347\211\271\346\200\247.md"
new file mode 100644
index 0000000..d1ed4d1
--- /dev/null
+++ "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/Java9\346\226\260\347\211\271\346\200\247.md"
@@ -0,0 +1,108 @@
+# Java 9 新特性
+
+Java 9 在 2017 年 9 月发布,带来了许多重大变化,其中最引人注目的是 Java 平台模块化系统(JPMS)。
+
+## 1. 模块化系统 (Project Jigsaw)
+
+模块化是 Java 9 的核心功能。它将 JDK 划分为一组模块,并允许开发者将自己的代码也打包成模块。
+
+- **目的**:解决 JAR Hell 问题,提高安全性(隐藏内部实现),提升性能。
+- **核心**:`module-info.java` 文件。
+
+一个简单的模块定义如下:
+
+```java
+// module-info.java
+module com.example.mymodule {
+ // 声明依赖于 java.sql 模块
+ requires java.sql;
+
+ // 声明将 com.example.mypackage 包导出,其他模块可以使用
+ exports com.example.mypackage;
+}
+```
+
+## 2. JShell (交互式命令行)
+
+Java 9 引入了 `jshell`,这是一个交互式的 Read-Eval-Print Loop (REPL) 工具,可以快速测试代码片段,无需创建完整的类。
+
+启动 `jshell`:
+```bash
+$ jshell
+| 欢迎使用 JShell -- 版本 9
+| 要大致了解该版本, 请键入: /help intro
+
+jshell> int x = 10;
+x ==> 10
+
+jshell> System.out.println("Hello, JShell!");
+Hello, JShell!
+```
+
+## 3. 接口的私有方法
+
+Java 8 允许在接口中使用 `default` 和 `static` 方法。Java 9 更进一步,允许定义 `private` 方法。这有助于在接口内部重用代码,避免将实现细节暴露给外部。
+
+```java
+public interface MyInterface {
+
+ void normalMethod();
+
+ default void method1() {
+ init();
+ System.out.println("Executing default method 1");
+ }
+
+ default void method2() {
+ init();
+ System.out.println("Executing default method 2");
+ }
+
+ // 私有方法,用于在默认方法之间共享代码
+ private void init() {
+ System.out.println("Initializing...");
+ }
+}
+```
+
+## 4. Stream API 的改进
+
+Stream API 增加了四个有用的新方法:`takeWhile`, `dropWhile`, `ofNullable`, `iterate`。
+
+- **`takeWhile(Predicate)`**: 返回从流的开头开始,满足谓词条件的元素。一旦遇到不满足条件的元素,立即停止。
+- **`dropWhile(Predicate)`**: `takeWhile` 的反操作。丢弃从流的开头开始,满足谓词条件的元素,然后返回剩余的流。
+
+```java
+Stream.of(1, 2, 3, 4, 5, 1, 2)
+ .takeWhile(n -> n < 4)
+ .forEach(System.out::print); // 输出: 123
+
+Stream.of(1, 2, 3, 4, 5, 1, 2)
+ .dropWhile(n -> n < 4)
+ .forEach(System.out::print); // 输出: 4512
+```
+
+## 5. Try-With-Resources 语法的改进
+
+Java 9 中,如果资源已经是 `final` 或等效于 `final` 的变量,则可以在 `try-with-resources` 语句中直接使用,而无需在 `try()` 中声明一个新变量。
+
+```java
+// Java 8
+Reader reader = new StringReader("test");
+try (Reader r = reader) {
+ // ...
+}
+
+// Java 9
+Reader reader = new StringReader("test");
+try (reader) { // 更简洁
+ // ...
+}
+```
+
+## 6. 其他重要特性
+
+- **`Optional` 类增强**:增加了 `ifPresentOrElse()`, `or()`, `stream()` 等方法。
+- **多版本兼容 JAR 包**:允许一个 JAR 文件包含针对不同 Java 版本的类文件。
+- **HTTP/2 客户端 API (孵化)**:引入了新的、现代的 HTTP 客户端 API,用于替代旧的 `HttpURLConnection`。
+- **`ProcessHandle` API**:提供了管理和查询操作系统进程的能力。
diff --git "a/Java\347\211\210\346\234\254\346\233\264\346\226\260/README.md" "b/Java\347\211\210\346\234\254\346\233\264\346\226\260/README.md"
new file mode 100644
index 0000000..e69de29
diff --git "a/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/spring \351\235\242\350\257\225\351\242\230/SpringBoot2\344\270\216SpringBoot3\345\214\272\345\210\253\350\257\246\350\247\243.md" "b/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/spring \351\235\242\350\257\225\351\242\230/SpringBoot2\344\270\216SpringBoot3\345\214\272\345\210\253\350\257\246\350\247\243.md"
new file mode 100644
index 0000000..c5698f1
--- /dev/null
+++ "b/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/spring \351\235\242\350\257\225\351\242\230/SpringBoot2\344\270\216SpringBoot3\345\214\272\345\210\253\350\257\246\350\247\243.md"
@@ -0,0 +1,893 @@
+# Spring Boot 2 与 Spring Boot 3 区别详解
+
+## 📋 目录
+- [版本概述](#版本概述)
+- [核心依赖变化](#核心依赖变化)
+- [Java版本要求](#java版本要求)
+- [配置变化](#配置变化)
+- [API变化](#api变化)
+- [性能改进](#性能改进)
+- [迁移指南](#迁移指南)
+- [面试重点](#面试重点)
+
+## 🎯 版本概述
+
+### Spring Boot 2.x vs 3.x 基本信息
+
+| 特性 | Spring Boot 2.x | Spring Boot 3.x |
+|------|----------------|----------------|
+| 发布时间 | 2018年3月 | 2022年11月 |
+| Spring Framework | 5.x | 6.x |
+| 最低Java版本 | Java 8 | Java 17 |
+| Jakarta EE | 不支持 | 支持 |
+| GraalVM原生镜像 | 实验性支持 | 生产就绪 |
+| 可观测性 | Micrometer | Micrometer + OpenTelemetry |
+| 支持周期 | 2023年11月结束 | 2025年11月结束 |
+
+## 🔧 核心依赖变化
+
+### 1. Spring Framework版本升级
+
+```java
+// Spring Boot 2.x 基于 Spring Framework 5.x
+@Configuration
+public class SpringBoot2Config {
+
+ // 使用传统的Servlet API
+ @Bean
+ public FilterRegistrationBean myFilter() {
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
+ registration.setFilter(new MyFilter());
+ registration.addUrlPatterns("/*");
+ return registration;
+ }
+}
+
+// Spring Boot 3.x 基于 Spring Framework 6.x
+@Configuration
+public class SpringBoot3Config {
+
+ // 支持更现代的配置方式
+ @Bean
+ public FilterRegistrationBean myFilter() {
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
+ registration.setFilter(new MyFilter());
+ registration.addUrlPatterns("/*");
+ // 新增的配置选项
+ registration.setAsyncSupported(true);
+ return registration;
+ }
+}
+```
+
+### 2. Jakarta EE迁移
+
+```java
+// Spring Boot 2.x - 使用 javax.* 包
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.validation.constraints.NotNull;
+
+@Entity
+public class User {
+ @Id
+ private Long id;
+
+ @NotNull
+ private String name;
+
+ // getter/setter
+}
+
+// Spring Boot 3.x - 使用 jakarta.* 包
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.validation.constraints.NotNull;
+
+@Entity
+public class User {
+ @Id
+ private Long id;
+
+ @NotNull
+ private String name;
+
+ // getter/setter
+}
+```
+
+## ☕ Java版本要求
+
+### 1. 最低版本要求变化
+
+```java
+// Spring Boot 2.x - 支持Java 8+
+public class SpringBoot2Features {
+
+ // 可以使用Java 8特性
+ public Optional processData(List data) {
+ return data.stream()
+ .filter(s -> s.length() > 5)
+ .findFirst();
+ }
+
+ // 但不能使用Java 17+的新特性
+}
+
+// Spring Boot 3.x - 要求Java 17+
+public class SpringBoot3Features {
+
+ // 可以使用Java 17的新特性
+ public sealed interface Shape permits Circle, Rectangle {
+ double area();
+ }
+
+ public record Circle(double radius) implements Shape {
+ @Override
+ public double area() {
+ return Math.PI * radius * radius;
+ }
+ }
+
+ public record Rectangle(double width, double height) implements Shape {
+ @Override
+ public double area() {
+ return width * height;
+ }
+ }
+
+ // 使用文本块
+ public String getJsonTemplate() {
+ return """
+ {
+ "name": "%s",
+ "age": %d,
+ "active": %b
+ }
+ """;
+ }
+}
+```
+
+### 2. 性能优化
+
+```java
+// Spring Boot 3.x 利用Java 17的性能改进
+@Service
+public class PerformanceOptimizedService {
+
+ // 利用Java 17的向量API(预览特性)
+ public void processLargeDataset(int[] data) {
+ // 向量化操作,性能更好
+ IntVector.SPECIES_256.fromArray(data, 0)
+ .add(IntVector.SPECIES_256.broadcast(10))
+ .intoArray(data, 0);
+ }
+
+ // 利用改进的垃圾收集器
+ @EventListener
+ public void handleLargeDataProcessing(DataProcessingEvent event) {
+ // ZGC和G1GC的改进使得大内存应用性能更好
+ processLargeDataInMemory(event.getData());
+ }
+}
+```
+
+## ⚙️ 配置变化
+
+### 1. 配置属性变化
+
+```yaml
+# Spring Boot 2.x 配置
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/db
+ username: user
+ password: pass
+ jpa:
+ hibernate:
+ ddl-auto: update
+ security:
+ user:
+ name: admin
+ password: secret
+
+# Spring Boot 3.x 配置变化
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/db
+ username: user
+ password: pass
+ jpa:
+ hibernate:
+ ddl-auto: update
+ # 安全配置方式改变
+ security:
+ user:
+ name: admin
+ password: secret
+ roles: ADMIN
+ # 新增的可观测性配置
+ management:
+ tracing:
+ sampling:
+ probability: 1.0
+ metrics:
+ distribution:
+ percentiles-histogram:
+ http.server.requests: true
+```
+
+### 2. 自动配置变化
+
+```java
+// Spring Boot 2.x 安全配置
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.authorizeRequests()
+ .antMatchers("/public/**").permitAll()
+ .anyRequest().authenticated()
+ .and()
+ .formLogin();
+ }
+}
+
+// Spring Boot 3.x 安全配置(WebSecurityConfigurerAdapter已废弃)
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig {
+
+ @Bean
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+ http.authorizeHttpRequests(authz -> authz
+ .requestMatchers("/public/**").permitAll()
+ .anyRequest().authenticated()
+ )
+ .formLogin(Customizer.withDefaults());
+
+ return http.build();
+ }
+}
+```
+
+## 🔄 API变化
+
+### 1. 废弃的API
+
+```java
+// Spring Boot 2.x 中可用但在3.x中废弃的API
+public class DeprecatedAPIs {
+
+ // 1. WebSecurityConfigurerAdapter 已废弃
+ // @Deprecated in Spring Boot 3.x
+ public class OldSecurityConfig extends WebSecurityConfigurerAdapter {
+ // 不再推荐使用
+ }
+
+ // 2. 一些Actuator端点变化
+ @Deprecated
+ public void oldActuatorUsage() {
+ // 某些端点路径和响应格式发生变化
+ }
+
+ // 3. 配置属性绑定方式变化
+ @ConfigurationProperties(prefix = "app")
+ public class OldConfigProperties {
+ // 某些绑定方式在3.x中不再支持
+ }
+}
+
+// Spring Boot 3.x 推荐的新API
+public class NewAPIs {
+
+ // 1. 新的安全配置方式
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+ return http.build();
+ }
+
+ // 2. 改进的配置属性绑定
+ @ConfigurationProperties(prefix = "app")
+ @ConstructorBinding
+ public record AppProperties(
+ String name,
+ Duration timeout,
+ List features
+ ) {}
+}
+```
+
+### 2. 新增功能
+
+```java
+// Spring Boot 3.x 新增功能
+@RestController
+public class SpringBoot3NewFeatures {
+
+ // 1. 改进的问题详情支持(RFC 7807)
+ @GetMapping("/error-demo")
+ public ResponseEntity errorDemo() {
+ ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(
+ HttpStatus.BAD_REQUEST,
+ "Invalid request parameter"
+ );
+ problemDetail.setTitle("Validation Error");
+ problemDetail.setProperty("timestamp", Instant.now());
+
+ return ResponseEntity.badRequest().body(problemDetail);
+ }
+
+ // 2. 原生镜像支持改进
+ @GetMapping("/native-ready")
+ public String nativeReady() {
+ // 更好的GraalVM原生镜像支持
+ return "This endpoint works well in native image";
+ }
+
+ // 3. 可观测性改进
+ @GetMapping("/traced-endpoint")
+ @Timed(name = "custom.endpoint.timer", description = "Custom endpoint timer")
+ public String tracedEndpoint() {
+ // 自动集成OpenTelemetry追踪
+ return "This request is automatically traced";
+ }
+}
+```
+
+## 📈 性能改进
+
+### 1. 启动性能
+
+```java
+// Spring Boot 3.x 启动性能优化
+@SpringBootApplication
+public class OptimizedApplication {
+
+ public static void main(String[] args) {
+ // 1. 改进的类路径扫描
+ SpringApplication app = new SpringApplication(OptimizedApplication.class);
+
+ // 2. 更快的Bean初始化
+ app.setLazyInitialization(true);
+
+ // 3. 原生镜像支持
+ app.run(args);
+ }
+}
+
+// 原生镜像配置
+@Configuration
+@ImportRuntimeHints(MyRuntimeHints.class)
+public class NativeImageConfig {
+
+ // 为原生镜像提供运行时提示
+ static class MyRuntimeHints implements RuntimeHintsRegistrar {
+ @Override
+ public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
+ hints.reflection().registerType(MyService.class,
+ MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
+ MemberCategory.INVOKE_DECLARED_METHODS);
+ }
+ }
+}
+```
+
+### 2. 内存使用优化
+
+```java
+// Spring Boot 3.x 内存优化
+@Configuration
+public class MemoryOptimization {
+
+ // 1. 改进的Bean定义处理
+ @Bean
+ @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public ExpensiveService expensiveService() {
+ // 更高效的原型Bean创建
+ return new ExpensiveService();
+ }
+
+ // 2. 优化的自动配置
+ @ConditionalOnClass(name = "com.example.OptionalDependency")
+ @Bean
+ public OptionalService optionalService() {
+ // 更智能的条件判断,减少不必要的类加载
+ return new OptionalService();
+ }
+}
+```
+
+## 🔄 迁移指南
+
+### 1. 依赖迁移
+
+```xml
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.18
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.1
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+```
+
+### 2. 代码迁移步骤
+
+```java
+// 迁移检查清单
+public class MigrationChecklist {
+
+ /*
+ * 1. 更新Java版本到17+
+ * 2. 替换javax.*包为jakarta.*包
+ * 3. 更新Spring Security配置
+ * 4. 检查废弃的API使用
+ * 5. 更新测试代码
+ * 6. 验证第三方库兼容性
+ * 7. 更新配置文件
+ * 8. 测试原生镜像构建(可选)
+ */
+
+ // 自动化迁移工具使用
+ public void useOpenRewriteMigration() {
+ /*
+ * 使用OpenRewrite自动迁移工具:
+ *
+ * 1. 添加OpenRewrite插件到pom.xml
+ * 2. 运行迁移命令:
+ * mvn org.openrewrite.maven:rewrite-maven-plugin:run
+ * -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:LATEST
+ * -Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0
+ */
+ }
+}
+```
+
+## 🎯 面试重点
+
+### Q1: Spring Boot 3相比Spring Boot 2有哪些重大变化?
+
+**答案:**
+```java
+public class MajorChanges {
+
+ /*
+ * 1. 基础要求变化
+ * - 最低Java版本:Java 8 → Java 17
+ * - Spring Framework:5.x → 6.x
+ * - Jakarta EE:javax.* → jakarta.*
+ *
+ * 2. 性能改进
+ * - 原生镜像支持从实验性变为生产就绪
+ * - 启动时间和内存使用优化
+ * - 更好的GraalVM集成
+ *
+ * 3. 可观测性增强
+ * - 内置OpenTelemetry支持
+ * - 改进的Micrometer集成
+ * - 更丰富的监控指标
+ *
+ * 4. API现代化
+ * - 废弃WebSecurityConfigurerAdapter
+ * - 改进的配置属性绑定
+ * - 新的问题详情支持(RFC 7807)
+ */
+}
+```
+
+### Q2: 为什么Spring Boot 3要求Java 17?
+
+**答案:**
+```java
+public class Java17Requirements {
+
+ // 1. 性能优势
+ public void performanceBenefits() {
+ /*
+ * - JVM性能改进:ZGC、G1GC优化
+ * - 编译器优化:更好的JIT编译
+ * - 内存管理:改进的垃圾收集算法
+ */
+ }
+
+ // 2. 语言特性
+ public sealed interface ModernJavaFeatures permits Record, TextBlock {
+ // 密封类、记录类、文本块等新特性
+ }
+
+ public record ConfigurationData(String name, int port, boolean enabled)
+ implements ModernJavaFeatures {
+ // 记录类简化数据传输对象
+ }
+
+ // 3. 长期支持
+ public void longTermSupport() {
+ /*
+ * - Java 17是LTS版本,支持周期长
+ * - 企业级应用的稳定性保证
+ * - 安全更新和bug修复
+ */
+ }
+}
+```
+
+### Q3: Jakarta EE迁移有什么影响?
+
+**答案:**
+```java
+// 迁移影响分析
+public class JakartaEEMigrationImpact {
+
+ // 1. 包名变化
+ // Spring Boot 2.x
+ // import javax.servlet.http.HttpServletRequest;
+ // import javax.persistence.Entity;
+ // import javax.validation.constraints.NotNull;
+
+ // Spring Boot 3.x
+ import jakarta.servlet.http.HttpServletRequest;
+ import jakarta.persistence.Entity;
+ import jakarta.validation.constraints.NotNull;
+
+ // 2. 第三方库兼容性
+ public void libraryCompatibility() {
+ /*
+ * 影响的库:
+ * - Hibernate 6.x+
+ * - Jackson 2.14+
+ * - Tomcat 10.x+
+ * - 需要检查所有使用javax.*的依赖
+ */
+ }
+
+ // 3. 迁移策略
+ public void migrationStrategy() {
+ /*
+ * 1. 使用IDE的全局替换功能
+ * 2. 使用OpenRewrite自动迁移工具
+ * 3. 逐步迁移,先更新核心模块
+ * 4. 充分测试,特别是集成测试
+ */
+ }
+}
+```
+
+### Q4: Spring Boot 3的原生镜像支持有什么优势?
+
+**答案:**
+```java
+@SpringBootApplication
+public class NativeImageAdvantages {
+
+ public static void main(String[] args) {
+ SpringApplication.run(NativeImageAdvantages.class, args);
+ }
+
+ /*
+ * 原生镜像优势:
+ *
+ * 1. 启动速度
+ * - 传统JVM:2-5秒
+ * - 原生镜像:50-200毫秒
+ *
+ * 2. 内存占用
+ * - 传统JVM:100-500MB
+ * - 原生镜像:20-100MB
+ *
+ * 3. 部署优势
+ * - 无需JVM环境
+ * - 容器镜像更小
+ * - 冷启动更快
+ *
+ * 4. 云原生友好
+ * - 适合Serverless
+ * - 适合微服务
+ * - 适合容器化部署
+ */
+}
+
+// 原生镜像配置示例
+@Configuration
+public class NativeImageConfig {
+
+ @Bean
+ @RegisterReflectionForBinding(UserDto.class)
+ public UserService userService() {
+ return new UserService();
+ }
+
+ // 运行时提示
+ @ImportRuntimeHints(CustomRuntimeHints.class)
+ static class CustomRuntimeHints implements RuntimeHintsRegistrar {
+ @Override
+ public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
+ // 注册反射、资源、代理等提示
+ hints.reflection().registerType(UserDto.class);
+ hints.resources().registerPattern("static/**");
+ }
+ }
+}
+```
+
+### Q5: Spring Boot 3的可观测性改进体现在哪里?
+
+**答案:**
+```java
+@RestController
+public class ObservabilityImprovements {
+
+ // 1. 自动追踪
+ @GetMapping("/api/users/{id}")
+ @Timed(name = "user.get", description = "Get user by ID")
+ public User getUser(@PathVariable Long id) {
+ // 自动生成追踪信息,无需手动配置
+ return userService.findById(id);
+ }
+
+ // 2. 改进的指标
+ @EventListener
+ public void handleUserCreated(UserCreatedEvent event) {
+ // 自动记录业务指标
+ Metrics.counter("user.created",
+ "type", event.getUser().getType()).increment();
+ }
+
+ // 3. 分布式追踪
+ @Async
+ public CompletableFuture processAsync() {
+ // 追踪信息自动传播到异步线程
+ return CompletableFuture.completedFuture("processed");
+ }
+}
+
+// 配置示例
+/*
+management:
+ tracing:
+ sampling:
+ probability: 1.0
+ metrics:
+ distribution:
+ percentiles-histogram:
+ http.server.requests: true
+ endpoints:
+ web:
+ exposure:
+ include: health,info,metrics,prometheus
+*/
+```
+
+## 🔧 实际迁移案例
+
+### 案例1:电商系统迁移
+
+```java
+// 迁移前(Spring Boot 2.x)
+@RestController
+@RequestMapping("/api/orders")
+public class OrderControllerV2 {
+
+ @Autowired
+ private OrderService orderService;
+
+ @PostMapping
+ public ResponseEntity> createOrder(@Valid @RequestBody OrderRequest request,
+ HttpServletRequest httpRequest) {
+ try {
+ Order order = orderService.createOrder(request);
+ return ResponseEntity.ok(order);
+ } catch (ValidationException e) {
+ return ResponseEntity.badRequest()
+ .body(Map.of("error", e.getMessage()));
+ }
+ }
+}
+
+// 迁移后(Spring Boot 3.x)
+@RestController
+@RequestMapping("/api/orders")
+public class OrderControllerV3 {
+
+ private final OrderService orderService;
+
+ // 构造函数注入(推荐)
+ public OrderControllerV3(OrderService orderService) {
+ this.orderService = orderService;
+ }
+
+ @PostMapping
+ public ResponseEntity> createOrder(@Valid @RequestBody OrderRequest request,
+ HttpServletRequest httpRequest) {
+ try {
+ Order order = orderService.createOrder(request);
+ return ResponseEntity.ok(order);
+ } catch (ValidationException e) {
+ // 使用RFC 7807问题详情
+ ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(
+ HttpStatus.BAD_REQUEST, e.getMessage());
+ problemDetail.setTitle("Order Validation Failed");
+ problemDetail.setProperty("timestamp", Instant.now());
+
+ return ResponseEntity.badRequest().body(problemDetail);
+ }
+ }
+}
+```
+
+### 案例2:安全配置迁移
+
+```java
+// Spring Boot 2.x 安全配置
+@Configuration
+@EnableWebSecurity
+public class SecurityConfigV2 extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.csrf().disable()
+ .authorizeRequests()
+ .antMatchers("/api/public/**").permitAll()
+ .antMatchers("/api/admin/**").hasRole("ADMIN")
+ .anyRequest().authenticated()
+ .and()
+ .oauth2ResourceServer()
+ .jwt();
+ }
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+ auth.inMemoryAuthentication()
+ .withUser("admin")
+ .password("{noop}password")
+ .roles("ADMIN");
+ }
+}
+
+// Spring Boot 3.x 安全配置
+@Configuration
+@EnableWebSecurity
+public class SecurityConfigV3 {
+
+ @Bean
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+ http.csrf(csrf -> csrf.disable())
+ .authorizeHttpRequests(authz -> authz
+ .requestMatchers("/api/public/**").permitAll()
+ .requestMatchers("/api/admin/**").hasRole("ADMIN")
+ .anyRequest().authenticated()
+ )
+ .oauth2ResourceServer(oauth2 -> oauth2
+ .jwt(Customizer.withDefaults())
+ );
+
+ return http.build();
+ }
+
+ @Bean
+ public InMemoryUserDetailsManager userDetailsService() {
+ UserDetails admin = User.builder()
+ .username("admin")
+ .password("{noop}password")
+ .roles("ADMIN")
+ .build();
+
+ return new InMemoryUserDetailsManager(admin);
+ }
+}
+```
+
+## 📊 性能对比
+
+### 启动时间对比
+
+```java
+// 性能测试结果
+public class PerformanceComparison {
+
+ /*
+ * 启动时间对比(相同应用):
+ *
+ * Spring Boot 2.7.x:
+ * - 传统JVM启动:3.2秒
+ * - 内存占用:280MB
+ *
+ * Spring Boot 3.2.x:
+ * - 传统JVM启动:2.8秒(12%提升)
+ * - 原生镜像启动:0.08秒(97%提升)
+ * - 内存占用:220MB(21%减少)
+ * - 原生镜像内存:45MB(84%减少)
+ */
+
+ // 构建时间对比
+ /*
+ * Maven构建时间:
+ * - Spring Boot 2.x:45秒
+ * - Spring Boot 3.x:38秒
+ * - 原生镜像构建:3分钟
+ */
+}
+```
+
+## 🚀 升级建议
+
+### 升级时机选择
+
+```java
+public class UpgradeStrategy {
+
+ /*
+ * 建议升级的场景:
+ *
+ * 1. 新项目
+ * - 直接使用Spring Boot 3.x
+ * - 享受最新特性和性能
+ *
+ * 2. 现有项目升级条件
+ * - Java版本可以升级到17+
+ * - 第三方依赖支持Jakarta EE
+ * - 有充足的测试时间
+ *
+ * 3. 暂缓升级的场景
+ * - 大量遗留代码
+ * - 关键第三方库不兼容
+ * - 生产环境稳定性要求极高
+ */
+
+ // 渐进式升级策略
+ public void gradualUpgrade() {
+ /*
+ * 1. 先升级开发环境
+ * 2. 升级测试环境
+ * 3. 小范围生产验证
+ * 4. 全面生产部署
+ */
+ }
+}
+```
+
+---
+
+*Spring Boot 2与3的详细对比分析完成,这些信息将帮助开发者做出明智的升级决策,并在面试中展现对技术演进的深入理解。*
diff --git "a/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/spring \351\235\242\350\257\225\351\242\230/SpringBoot2\345\256\214\346\225\264\345\255\246\344\271\240\346\214\207\345\215\227.md" "b/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/spring \351\235\242\350\257\225\351\242\230/SpringBoot2\345\256\214\346\225\264\345\255\246\344\271\240\346\214\207\345\215\227.md"
new file mode 100644
index 0000000..aa572c2
--- /dev/null
+++ "b/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/spring \351\235\242\350\257\225\351\242\230/SpringBoot2\345\256\214\346\225\264\345\255\246\344\271\240\346\214\207\345\215\227.md"
@@ -0,0 +1,1303 @@
+# Spring Boot 2 完整学习指南 - 生命周期、加载方式、运行流程
+
+## 📋 目录
+- [Spring Boot 2 概述](#spring-boot-2-概述)
+- [Spring Boot 生命周期](#spring-boot-生命周期)
+- [自动配置原理](#自动配置原理)
+- [启动流程详解](#启动流程详解)
+- [Bean加载机制](#bean加载机制)
+- [配置加载顺序](#配置加载顺序)
+- [核心注解解析](#核心注解解析)
+- [面试常见问题](#面试常见问题)
+
+## 🎯 Spring Boot 2 概述
+
+### 什么是Spring Boot?
+
+Spring Boot是Spring团队提供的全新框架,设计目的是简化Spring应用的初始搭建以及开发过程。
+
+**核心特性:**
+- **约定优于配置**:提供默认配置,减少样板代码
+- **自动配置**:根据classpath自动配置Spring应用
+- **嵌入式服务器**:内置Tomcat、Jetty等服务器
+- **生产就绪**:提供监控、健康检查等功能
+
+### Spring Boot 2.x 主要改进
+
+```java
+// Spring Boot 2.x 主要变化
+public class SpringBoot2Changes {
+
+ // 1. 基于Spring Framework 5.x
+ // 2. 最低JDK版本要求:Java 8
+ // 3. 支持响应式编程(WebFlux)
+ // 4. 配置属性绑定改进
+ // 5. Actuator端点重构
+ // 6. 安全配置简化
+}
+```
+
+## 🔄 Spring Boot 生命周期
+
+### 1. 应用生命周期概览
+
+```java
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ // 1. 创建SpringApplication实例
+ SpringApplication app = new SpringApplication(Application.class);
+
+ // 2. 运行应用
+ ConfigurableApplicationContext context = app.run(args);
+
+ // 3. 应用运行中...
+
+ // 4. 关闭应用
+ context.close();
+ }
+}
+```
+
+### 2. 详细生命周期阶段
+
+```java
+@Component
+public class ApplicationLifecycleListener {
+
+ // 阶段1:应用启动前
+ @EventListener
+ public void handleApplicationStartingEvent(ApplicationStartingEvent event) {
+ System.out.println("1. 应用开始启动");
+ }
+
+ // 阶段2:环境准备完成
+ @EventListener
+ public void handleApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {
+ System.out.println("2. 环境准备完成");
+ }
+
+ // 阶段3:上下文准备完成
+ @EventListener
+ public void handleApplicationContextInitializedEvent(ApplicationContextInitializedEvent event) {
+ System.out.println("3. 上下文初始化完成");
+ }
+
+ // 阶段4:上下文准备完成
+ @EventListener
+ public void handleApplicationPreparedEvent(ApplicationPreparedEvent event) {
+ System.out.println("4. 上下文准备完成");
+ }
+
+ // 阶段5:应用启动完成
+ @EventListener
+ public void handleApplicationStartedEvent(ApplicationStartedEvent event) {
+ System.out.println("5. 应用启动完成");
+ }
+
+ // 阶段6:应用就绪
+ @EventListener
+ public void handleApplicationReadyEvent(ApplicationReadyEvent event) {
+ System.out.println("6. 应用就绪,可以接收请求");
+ }
+
+ // 阶段7:应用启动失败
+ @EventListener
+ public void handleApplicationFailedEvent(ApplicationFailedEvent event) {
+ System.out.println("7. 应用启动失败");
+ }
+}
+```
+
+### 3. Bean生命周期
+
+```java
+@Component
+public class BeanLifecycleDemo implements InitializingBean, DisposableBean {
+
+ private String name;
+
+ // 1. 构造函数
+ public BeanLifecycleDemo() {
+ System.out.println("1. 构造函数执行");
+ }
+
+ // 2. 属性注入
+ @Autowired
+ public void setName(@Value("${app.name:demo}") String name) {
+ this.name = name;
+ System.out.println("2. 属性注入完成: " + name);
+ }
+
+ // 3. BeanNameAware
+ @Override
+ public void setBeanName(String name) {
+ System.out.println("3. BeanNameAware: " + name);
+ }
+
+ // 4. BeanFactoryAware
+ @Override
+ public void setBeanFactory(BeanFactory beanFactory) {
+ System.out.println("4. BeanFactoryAware");
+ }
+
+ // 5. ApplicationContextAware
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) {
+ System.out.println("5. ApplicationContextAware");
+ }
+
+ // 6. @PostConstruct
+ @PostConstruct
+ public void postConstruct() {
+ System.out.println("6. @PostConstruct执行");
+ }
+
+ // 7. InitializingBean
+ @Override
+ public void afterPropertiesSet() {
+ System.out.println("7. InitializingBean.afterPropertiesSet()");
+ }
+
+ // 8. @PreDestroy
+ @PreDestroy
+ public void preDestroy() {
+ System.out.println("8. @PreDestroy执行");
+ }
+
+ // 9. DisposableBean
+ @Override
+ public void destroy() {
+ System.out.println("9. DisposableBean.destroy()");
+ }
+}
+```
+
+## ⚙️ 自动配置原理
+
+### 1. @SpringBootApplication注解解析
+
+```java
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@SpringBootConfiguration // 等同于@Configuration
+@EnableAutoConfiguration // 启用自动配置
+@ComponentScan(excludeFilters = { // 组件扫描
+ @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
+ @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
+})
+public @interface SpringBootApplication {
+ // ...
+}
+```
+
+### 2. @EnableAutoConfiguration工作原理
+
+```java
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@AutoConfigurationPackage
+@Import(AutoConfigurationImportSelector.class) // 关键:导入自动配置选择器
+public @interface EnableAutoConfiguration {
+ // ...
+}
+
+// 自动配置导入选择器
+public class AutoConfigurationImportSelector implements DeferredImportSelector {
+
+ @Override
+ public String[] selectImports(AnnotationMetadata annotationMetadata) {
+ // 1. 检查自动配置是否启用
+ if (!isEnabled(annotationMetadata)) {
+ return NO_IMPORTS;
+ }
+
+ // 2. 获取自动配置条目
+ AutoConfigurationEntry autoConfigurationEntry =
+ getAutoConfigurationEntry(annotationMetadata);
+
+ return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
+ }
+
+ protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
+ // 3. 加载spring.factories中的配置类
+ List configurations = getCandidateConfigurations(annotationMetadata, attributes);
+
+ // 4. 去重
+ configurations = removeDuplicates(configurations);
+
+ // 5. 排除不需要的配置
+ Set exclusions = getExclusions(annotationMetadata, attributes);
+ configurations.removeAll(exclusions);
+
+ // 6. 过滤(根据条件注解)
+ configurations = getConfigurationClassFilter().filter(configurations);
+
+ return new AutoConfigurationEntry(configurations, exclusions);
+ }
+}
+```
+
+### 3. 条件注解机制
+
+```java
+// 示例:Redis自动配置
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnClass(RedisOperations.class) // 类路径存在RedisOperations
+@EnableConfigurationProperties(RedisProperties.class) // 启用配置属性
+@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
+public class RedisAutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean(name = "redisTemplate") // 不存在redisTemplate bean
+ @ConditionalOnSingleCandidate(RedisConnectionFactory.class) // 存在唯一的连接工厂
+ public RedisTemplate