# jdk8to21 **Repository Path**: john-code/jdk8to21 ## Basic Information - **Project Name**: jdk8to21 - **Description**: 用来练习jdk8->21的特性随笔 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-01 - **Last Updated**: 2026-03-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # jdk8to21 示例项目 本项目展示了从 JDK 8 到 JDK 21 的新特性与现代 Java 编程实践的结合,涵盖函数式编程、流式处理、并发控制、缓存机制、事件监听、加密安全、规则引擎、虚拟线程等多个方面。适合希望了解 Java 演进和现代 Java 开发技巧的开发者。 ## 项目特点 - **JDK 版本兼容性**:支持 JDK 8 到 JDK 21,展示不同版本下的代码结构与特性使用。 - **缓存实现**:整合了 Caffeine 与 Guava 缓存,并通过 Spring Cache 展示高效的本地缓存与统一缓存抽象。 - **函数式编程**:使用函数接口、lambda 表达式简化代码逻辑。 - **流式处理(Stream)**:提供丰富的 Stream 流操作与集合处理示例。 - **并发编程**:涵盖线程同步、线程池、ThreadLocal、原子操作等并发控制手段。 - **事件驱动架构**:通过 Spring 的事件监听机制实现解耦逻辑。 - **回调模式**:演示回调机制在业务逻辑中的应用。 - **网络请求工具**:封装基于 Java 11 的 `HttpClient` 的同步与异步请求工具类。 - **加密与安全**:基于 AES-GCM、SM2、RSA 等实现对称/非对称加解密与签名验签示例。 - **规则引擎与流程编排**:使用 MVEL 与 LiteFlow 演示规则计算、流程编排与编排配置(XML)。 - **虚拟线程与新特性**:包含虚拟线程、字符串模板、增强的集合工厂方法、Flow API 等 JDK 21 相关示例。 ## 快速开始 ### 环境要求 - JDK 8 或更高版本 - Maven 3.x - Spring Boot 2.x(兼容) ### 构建与运行 ```bash # 使用 Maven 构建项目 mvn clean package # 运行主类 mvn spring-boot:run ``` ### 启动后访问 ```bash # 测试 Starter 配置是否生效 curl http://localhost:8080/testStarter # 查询用户接口(GET) curl http://localhost:8080/u/q?name=Tom ``` ## 核心模块 ### 缓存模块 - `CacheFactory`:基于 Guava 构建缓存工厂。 - `CaffeineCache`:演示 Caffeine 缓存的使用。 - `UserInfoCacheLoader`:缓存加载器实现。 ### 函数式编程与 Stream - `FunctionalProgrammingDemo`:**函数式编程完整示例**,涵盖 9 大模块: - 1. 函数式接口(Supplier/Consumer/Function/Predicate/BiFunction 等) - 2. Lambda 表达式(语法、变量捕获) - 3. 方法引用(静态/实例/构造器/数组构造器) - 4. Optional(创建、map、flatMap、orElse) - 5. Stream 基础(创建、遍历) - 6. Stream 中间操作(map、filter、flatMap、sorted、distinct 等) - 7. Stream 终端操作(reduce、min/max、match、find) - 8. Stream Collect(toList、toMap、groupingBy、partitioningBy) - 9. 组合与链式调用 - `FunctionalProgrammingCase`:自定义函数式接口、Record + Stream、模式匹配(JDK 21) - `FunctionInterface01Test` / `FunctionMethodTest`:函数式接口与 lambda 示例。 - `CollectDemo` / `CollectionStream01Test` / `OprationalTest`:Stream 流操作示例。 运行函数式编程示例:`java -cp target/classes com.yumingjiang.fp.FunctionalProgrammingDemo` ### 事件监听与发布 - `ContainerInitListener` / `ContainerRefreshedListener`:Spring 容器事件监听。 - `UserQuerySuccessEventListener`:监听 `QueryUserSuccessEvent`,在用户查询成功时记录日志。 ### 并发编程 - `TestAtomicity`:原子操作与线程安全。 - `TestThreadLocal`:线程上下文隔离。 - `ThreadPoolExecutorTest`:线程池使用示例。 - `ThreadSyncSleepTest`:synchronized 与 sleep 的行为演示。 ### 工具类 - `HttpClientUtil`:封装 Java 11 的 HttpClient,支持同步与异步请求。 - `MvelUtil`:使用 MVEL 实现规则表达式判断与计算。 - `VersionGeneratorUtil`:版本号生成工具。 - `JsonUtil`:基于 Fastjson2 的 JSON 序列化/反序列化、深拷贝、格式校验。 - `DateUtil`:基于 java.time 的日期格式化、解析、转换与计算。 - `IdGeneratorUtil`:UUID、短 ID、时间戳序号的 ID 生成。 - `RetryUtil`:可配置次数与间隔的操作重试工具。 - `ValidationUtil`:手机号、邮箱、身份证、URL 等格式校验。 - `DesensitizeUtil`:姓名、手机号、证件号、邮箱脱敏工具。 ### JDK 21 与语言特性示例 - `Jdk21TeXin`:演示文本块(Text Block)、`instanceof` 模式匹配、集合工厂方法、虚拟线程等语言与库新特性。 - `VirtualThreadDemo`:使用 `Executors.newVirtualThreadPerTaskExecutor()` 演示大量 I/O 密集任务在线程资源友好的情况下并发执行。 - `SubTest` / `MySubscriber`:基于 `java.util.concurrent.Flow` 与 `SubmissionPublisher` 的响应式流示例。 ### 加密与安全 - `AesGcmUtils`:基于 `AES/GCM/NoPadding` 的对称加密工具类,支持随机 IV、认证标签与完整性校验。 - `SM2Utils`:基于 Bouncy Castle 的 SM2 椭圆曲线国密算法工具类,包含密钥对生成、签名/验签与加解密。 - `RSAUtil` 及相关测试:展示 RSA 非对称加密、签名验签等用法。 ### 流程编排与规则引擎 - LiteFlow 组件:`ACmp`、`BCmp`、`CCmp` 以及 `config/flow.xml`,展示通过配置驱动的流程编排。 - `MvelUtil` 与 `MvelUtilTest`:结合 MVEL 表达式进行动态规则计算与单元测试。 ### 测试与示例代码 - `VersionGeneratorUtilTest`:演示语义化版本号生成与断言。 - 加解密相关测试:`AESUtilTest`、`RSATest`、`SM2Test` 等,验证加密算法实现的正确性。 - 工具类单元测试:`JsonUtilTest`、`DateUtilTest`、`IdGeneratorUtilTest`、`ValidationUtilTest`、`RetryUtilTest`、`DesensitizeUtilTest`。 - Mockito 示例:如 `MapMockito`、`Student`/`Student1`,展示使用 Mockito 进行单元测试与行为验证。 ## 优化记录 以下为业务代码与架构的优化记录。 ### UserController 链路优化(2025-03) **涉及类**:`UserController`、`UserServiceImpl`、`UserService`(新增)、`CacheFactory`、`UserQuerySuccessEventListener` | 变更项 | 变更前 | 变更后 | |--------|--------|--------| | 依赖倒置 | Controller 直接依赖 `UserServiceImpl` | Controller 依赖 `UserService` 接口,便于 Mock 与替换实现 | | 事件发布位置 | Controller 在查询后发布 `QueryUserSuccessEvent` | Service 在查询成功后发布,职责下沉至领域层 | | Controller 职责 | 实现 `ApplicationEventPublisherAware`,注入并持有 `eventPublisher` | 仅负责 HTTP 入参与结果返回,单一职责 | | 依赖注入方式 | `UserServiceImpl` 使用 `@Autowired` 字段注入 | 使用构造器注入,依赖不可变、易测试 | | 空参数处理 | `name=null` 时 Guava `get(null)` 抛 NPE | Service 层对 `name==null` 提前返回 `null` | | CacheFactory | `RemovalListener` 匿名内部类 | 使用 Lambda 简化 | | EventListener | 未对 `event.getUser()` 做 null 校验 | 增加 null 判断,避免潜在 NPE | **调用链路(优化后)**: ``` GET /u/q?name=Tom → UserController.query(name) → UserService.queryUserByName(name) [UserServiceImpl] → userCache.get(name) [Guava LoadingCache] → UserInfoCacheLoader.load(name) [缓存未命中时] → 查询成功后发布 QueryUserSuccessEvent → UserQuerySuccessEventListener.handleUserQuerySuccessEvent → 返回 User ``` ## 修复记录 以下为项目构建与测试相关的修复记录,便于后续维护与排错。 | 日期 | 问题 | 修复说明 | |------|------|----------| | 2025-03 | 项目无法编译,Lombok 注解未生效 | 在 `pom.xml` 中为 `maven-compiler-plugin` 显式配置 `annotationProcessorPaths`,加入 Lombok 依赖,确保编译期注解处理正常 | | 2025-03 | Lombok 与 JDK 21 不兼容 (`TypeTag :: UNKNOWN`) | 将 Lombok 版本从 `1.18.30` 升级至 `1.18.38`,解决与 JDK 21 的兼容性问题 | | 2025-03 | Maven 无法发现测试类 (`No tests to run`) | 测试源码原位于 `src/test/com/`,不符合 Maven 标准结构。已将测试目录调整为 `src/test/java/com/` | 运行 MVEL 相关单元测试: ```bash mvn test -Dtest=com.yumingjiang.utils.mvel.MvelUtilTest#testMvelUtil ``` ## 贡献指南 欢迎提交 Pull Request 和 Issue。请遵循项目现有代码风格,并保持示例简洁清晰。 ## 开源协议 本项目采用 [MIT License](https://opensource.org/licenses/MIT) 协议。