所有主题

主题

java

该主题下共 59 篇笔记

java

  1. Junit5 快速上手指南

    Junit5 快速上手指南:JUnit 5 = Platform + Jupiter + Vintage 的模块划分,重点演示参数化测试(@ParameterizedTest + @CsvSource)相比 JUnit4 大幅减少重复用例,并介绍 junit-pioneer、junit-json-params、Easy Random 三个实用扩展插件及其 Maven 配置。

    2 分钟阅读
  2. H2 数据库的使用指南

    用纯 Java 实现的内存数据库 H2 在单元测试中替代真实数据库:pom 依赖引入、用 classpath 下的 .sql 建表脚本与 CSV 初始化数据、以及通过 JDBC URL 参数(MODE=mysql、DB_CLOSE_DELAY、INIT=RUNSCRIPT)配置内存库并连接验证的完整示例。

    2 分钟阅读
  3. Kotlin分享小记

    团队内部 Kotlin 分享整理:从 Java Bean 与 Kotlin data class 的对比出发,介绍 Kotlin 的类型推断、字符串模板、表达式与 when、可空类型与作用域函数(let/run/apply 等)、DSL 风格构建、协程(suspend/launch/async)以及在 Maven 中混用 Java 与 Kotlin 的接入方式。

    7 分钟阅读
  4. 从Excel的读写来看Kotlin的扩展方法

    以重构 Apache POI 操作 Excel 的代码为例,展示 Kotlin 扩展方法的威力:通过 operator 关键字重载 Sheet/Row/Workbook 的 get/set 操作符,让调用方可以用 sheet[row, column] = value 的方式直观地构建 Excel,并用 object + apply/use 简化资源管理。

    2 分钟阅读
  5. Orika的使用姿势

    介绍 Java Bean 拷贝框架 Orika 的使用方式:从默认按字段名拷贝,到通过 classMap 配置字段映射、利用 BidirectionalConverter 处理枚举/JSON 等自定义类型转换,避免工程中大量重复的 setter/getter 代码。

    2 分钟阅读
  6. Tomcat是如何启动的

    从 server.xml 配置出发解析 Tomcat 的整体设计:Server/Service/Connector/Container(Engine/Host/Context/Wrapper)/Executor/Listener 等核心接口的职责,并追踪 catalina.sh 启动脚本到 Bootstrap 通过反射调用 Catalina、再借助 Digester 解析 server.xml 构建出整个 Tomcat 服务器的启动过程。

    4 分钟阅读
  7. Spring Boot —— With Transaction

    在 Spring Boot 中接入 MySQL 并使用 @Transactional 管理事务的实战:从 Maven 依赖、application.properties 配置,到 Spring 事务的 4 个隔离级别与 7 个传播行为的详解,并通过 UserService 示例观察事务行为。

    2 分钟阅读
  8. 利用Btrace脚本获取应用的运行时信息

    介绍动态追踪工具 Btrace:通过 Java 动态织入技术在不重启线上应用的前提下截获方法调用、入参与耗时。涵盖 Btrace 安装、@OnMethod/@OnTimer/@OnExit 等注解的配置与 @Self、@Duration、@Return 等参数注解的使用。

    3 分钟阅读
  9. Guava 中的一致性哈希

    介绍 Google Guava 的 Hashing 类中 consistentHash() 静态方法提供的一致性哈希实现:传入分片键和机器数量即可返回数据应落入的桶号,并解析其内部基于 LCG(线性同余)伪随机数算法的跳跃桶实现原理。

    1 分钟阅读
  10. Spring Boot With Http2

    在 Spring Boot 中以 Undertow 为 Web 容器启用 HTTP/2 的实战:使用 keytool 生成自签名 PKCS12 证书、引入 Jetty alpn_boot 让 JVM 支持 ALPN 协议协商、通过 UndertowBuilderCustomizer 开启 HTTP/2 并配置 HTTPS。

    2 分钟阅读
  11. Netflix Zuul vs OpenResty

    对 Spring Cloud Zuul(Java 网关)和基于 Nginx 的 OpenResty 进行反向代理性能压测对比:使用 wrk 在不同线程/连接数下多轮测试同一 REST 接口,观察 JVM 预热后 Zuul 与 OpenResty 的吞吐量表现。

    1 分钟阅读
  12. 使用Hystrix保护服务

    介绍 Netflix Hystrix 如何通过命令模式在分布式环境中防止服务雪崩:用 HystrixCommand 封装业务逻辑、在 getFallback() 中提供服务降级、借助 RxJava 的 Observable 处理异常响应,以及 CommandKey/GroupKey/ThreadPoolKey 的命名与线程池隔离。

    2 分钟阅读
  13. Spring boot start with Undertow

    在 Spring Boot 中用 Undertow 替换默认的 Tomcat 作为 Web 容器:通过 starter 引入 undertow、在配置类中启用 HTTP/2、调整 io-threads/worker-threads/buffer 等参数,并用 wrk 与 jconsole 对比 Undertow 与 Tomcat 的压测和资源占用表现。

    1 分钟阅读
  14. 并发策略 —— CAS

    拆解 CAS(Compare and Swap)无锁并发思路:V/E/N 三个参数的语义、自旋重试的伪代码,以及 jdk atomic 包下 Unsafe.compareAndSwapInt 与 AtomicInteger.incrementAndGet 是如何借助 CAS 实现无锁自增的。

    1 分钟阅读
  15. 不一样的 List 02 —— LinkedList 解析

    从源码层面拆解 LinkedList:内部双向链表的 Node 结构、add/linkLast 的尾插、addAll 的批量插入、node() 二分查找定位,以及 unlink 节点摘除,并对比 ArrayList 在增删与查询上的取舍。

    2 分钟阅读
  16. 不一样的 List 01 —— ArrayList 解析

    从源码层面拆解 ArrayList:三种构造方法的内存分配差异、add 时的扩容机制(1.5 倍增长与 Arrays.copyOf)、remove 的数组拷贝删除、O(1) 的随机查询,以及初始化估算容量、减少修改的最佳使用姿势。

    4 分钟阅读
  17. 认识 logback

    系统介绍 Java 日志框架 logback 的核心组件:appender(输出位置)、Encoder(二进制流转换)、layout(格式模板)与 filter(过滤规则),以及如何在 Spring Boot 中通过 logback-spring.xml 配合 springProperty/springProfile 实现配置注入与环境切换。

    3 分钟阅读
  18. 利用Actuator构建Spring Boot的监控

    使用 Spring Boot Actuator 构建依赖服务的健康监测体系:以 MongoDB 为例继承 AbstractHealthIndicator 实现 doHealthCheck(),通过 /health 端点和 JMX(jconsole)查看应用及依赖服务的健康状态,服务异常时返回 503 并暴露错误详情。

    1 分钟阅读
  19. RabbitMQ with Spring Boot

    在 Spring Boot 中通过 spring-amqp / spring-rabbit 整合 RabbitMQ:使用 amqp starter 配置连接、定义 Queue/DirectExchange/Binding,通过 RabbitTemplate 发送消息并用 SimpleMessageListenerContainer 持续监听队列。

    1 分钟阅读
  20. Netty中的字节操作

    解析 Netty 高性能背后的字节操作设计:ByteBuf 的 readerIndex/writerIndex/capacity 三大属性、Heap Buffer / Direct Buffer / Composite Buffer 三种模式(包括 Zero-Copy 实现),以及通过 ByteBufAllocator 与 Unpooled 分配池化内存的方式。

    2 分钟阅读
  21. Spring Boot —— 配置切换指南

    梳理 Spring Boot 的配置加载优先级机制(从命令行参数、系统属性、环境变量到 jar 内外 application.properties 共 9 级),并演示如何通过 --spring.config.location 指定外部配置文件、用 @Value 注入和 CommandLineRunner 实现不同环境(开发/测试/生产)间的配置切换。

    2 分钟阅读
  22. Spring Boot -- Start Up

    Spring Boot 入门实战:通过 spring-boot-starter-parent 与 spring-boot-starter-web 在 Maven 中引入 Spring Boot,编写 @Controller + @EnableAutoConfiguration 启动类直接运行 main() 启动一个嵌入式 Tomcat 的 Web 项目,并演示 application.properties 配置与访问效果。

    2 分钟阅读
  23. Spring Boot —— 启动彩蛋

    介绍 Spring Boot 启动时控制台 banner 的自定义彩蛋:在 resource 目录下放置 banner.txt 替换默认 Spring 图标,借助字符画生成网站制作图案,并使用 ${AnsiColor.XXX} 控制颜色、${application.version} / ${spring-boot.version} 等占位符展示项目信息。

    1 分钟阅读
  24. 利用Metrics+InfluxDB+Grafana构建监控平台

    在 Metrics 基础上结合 InfluxDB(时序数据库)和 Grafana(可视化面板)搭建一套完整的业务监控平台:通过 yum 在 CentOS 7 上安装两个服务,使用 metrics-influxdb 的 InfluxdbReporter 把度量数据写入 InfluxDB,再用 Grafana 配置数据源与图表,最后用 wrk 压测观察实时监控画面。

    1 分钟阅读
  25. Metrics —— JVM上的实时监控类库

    系统介绍 Dropwizard Metrics 这个 JVM 实时监控类库:以 MetricRegistry 为中心容器,详解 Meters(TPS 速率)、Histograms(直方图)、Counters(计数器)、Timers(计时器)、Gauges(自定义度量)五种度量类型的使用,并通过 Reporter 将数据输出到 Console/JMX/Slf4j。

    3 分钟阅读
  26. Netty构建Http服务器

    使用 Netty 实现一个自定义的 HTTP 服务器:介绍 HTTP 请求/响应协议结构,编写 SimpleChannelInboundHandler 处理 HttpRequest 与 LastHttpContent 并返回 Hello World,通过 HttpServerCodec 编解码、ServerBootstrap + NioEventLoopGroup 启动监听 8888 端口,并用 httpie 进行验证。

    1 分钟阅读
  27. 利用Netty构建自定义协议的通信

    使用 Netty 实现一个名为 luck 的自定义应用层协议(Header + Content):定义 LuckHeader/LuckMessage 数据结构,通过继承 ByteToMessageDecoder 与 MessageToByteEncoder 实现编解码器,再配合 ServerBootstrap 和客户端完成自定义协议的双端通信验证。

    1 分钟阅读
  28. 使用Netty创建Telnet服务

    用 Netty 实现一个 Telnet 服务端:通过 ServerBootstrap 配置 boss/worker 两个 NioEventLoopGroup,在 ChannelInitializer 中加入 DelimiterBasedFrameDecoder 与 StringDecoder/Encoder,再用 SimpleChannelInboundHandler 处理连接握手与请求响应,最后用系统 telnet 命令完成验证。

    1 分钟阅读
  29. 全局唯一ID设计

    对比分布式系统中三种全局唯一 ID 生成方案的优劣:数据库自增(简单但难扩展)、UUID(全局唯一但占空间且无序)、Twitter Snowflake(41bit 毫秒时间戳 + 区域 + 机器号 + 序列号拼成 64bit long,趋势递增)。附带 Java 与 Python 版本的自定义 Snowflake 实现,并提醒注意 NTP 时间回拨与跨毫秒序列随机化等细节。

    2 分钟阅读
  30. 从Java文件到字节码文件

    结合 OpenJDK 中 javac 的源码,拆解 Java 源码到字节码文件的四个编译步骤:词法解析(关键字到 Token)、语法解析(Token 到抽象语法树)、语义解析(补全与常量折叠),以及最终的字节码生成。

    6 分钟阅读
  31. Java线程池解析

    从类图出发拆解 Java 线程池:Executors 提供的四种内置线程池、ThreadPoolExecutor 的七个核心参数(核心线程数、最大线程数、任务队列、饱和策略等),以及 execute() 分三步调度线程执行任务的内幕。

    3 分钟阅读
  32. Java的几个同步辅助类

    梳理 Java 并发包中几个常用的同步辅助类:CountDownLatch 的一次性倒计数等待、CyclicBarrier 的循环屏障,以及 Semaphore 的资源许可控制,并用统计磁盘、赛跑起跑、连接池等例子说清各自的使用场景。

    2 分钟阅读
  33. Speedment -- 利用lambda编写SQL

    介绍利用 Java8 lambda 表达式操作数据库的 ORM 框架 Speedment,从 Maven 配置、GUI 代码生成,到持久化、查询、并行流与 JSON 序列化的实践。

    2 分钟阅读
  34. 函数的记忆

    探讨函数缓存与记忆化(Memoization)的原理:为什么只有纯函数适用,并通过 Java8 自定义 Memoizer 来实现闭包级别的结果缓存。

    1 分钟阅读
  35. Jvm --- 常用工具

    介绍 JDK 自带的几个常用 JVM 诊断工具:jps、jstat、jinfo、jmap 和 jstack 的作用与常用参数,帮助快速排查 Java 进程与运行时状态。

    2 分钟阅读
  36. MongoDB Java Driver操作指南

    介绍 MongoDB 3.0 Java Driver 的使用方式,涵盖建立连接、集合操作、文档增删改查、条件过滤、排序投影以及 Bulk 批量操作。

    4 分钟阅读
  37. 简易的设计模式——中介者模式

    讲解中介者模式的定义与 Mediator、ConcreteMediator、Colleague 等角色,通过 Java 代码演示如何用中介对象封装同事类之间的交互,降低多对象间的耦合。

    1 分钟阅读
  38. 简易的设计模式——原型模式

    讲解原型模式的定义与核心 clone 方法,通过 Java 代码演示基于内存二进制拷贝创建对象的方式,并分析其性能优势与适用场景。

    1 分钟阅读
  39. 简易的设计模式——适配器模式

    讲解适配器模式的定义与 Target、Adaptee、Adapter 三种角色,通过 Java 代码演示如何将已有接口转换成客户端期望的接口,让原本不兼容的类协同工作。

    1 分钟阅读
  40. 简易的设计模式——建造者模式

    讲解建造者模式的定义与 Product、Builder、ConcreteBuilder、Director 四个角色,通过 Java 代码演示如何将复杂对象的构建与表示分离,按顺序组装出不同产品。

    1 分钟阅读
  41. 简易的设计模式——模板方法模式

    讲解模板方法模式的定义与抽象模板类、具体模板类两种角色,通过 Java 代码演示父类定义算法框架、子类实现具体步骤的设计思路。

    1 分钟阅读
  42. 简易的设计模式——代理模式

    讲解代理模式的定义与 Subject、RealSubject、Proxy 三种角色,通过 Java 代码演示如何用代理类控制对真实对象的访问并在调用前后插入额外逻辑。

    1 分钟阅读
  43. 简易的设计模式——访问者模式

    讲解访问者模式的定义与 Visitor、Element、ObjectStructure 等角色,通过 Java 代码演示如何在不改变数据结构的前提下为元素定义新的操作。

    1 分钟阅读
  44. 简易的设计模式——备忘录模式

    介绍备忘录模式的定义与 Originator、Memento、Caretaker 三个角色,通过 Java 代码演示如何在不破坏封装的前提下保存和恢复对象内部状态。

    1 分钟阅读
  45. 简易的设计模式——门面模式

    讲解门面模式(外观模式)的定义、Facade 与 subsystem 两种角色,并用 Java 代码演示如何通过统一门面对象屏蔽子系统细节,降低外部依赖。

    1 分钟阅读
  46. 简易的设计模式——观察者模式

    介绍观察者模式(发布订阅模式)的定义和 Subject、Observer 等四种角色,用 Java 代码演示被观察者如何动态增删观察者并在状态变化时触发通知。

    1 分钟阅读
  47. 简易的设计模式——桥梁模式

    讲解桥梁模式的定义与四个角色(抽象化、修正抽象化、实现化、具体实现化),通过 Java 代码示例演示如何将抽象与实现解耦,使两者能够独立演进。

    1 分钟阅读
  48. static与并发

    探讨 Java 中被 static 修饰的方法在多线程并发场景下是否存在数据安全问题,通过示例代码验证静态方法因局部变量而天然线程安全的原理。

    1 分钟阅读
  49. Java下几种加密方式的实现

    用 Java 实现 AES 对称加密、SHA 摘要算法与 RSA 非对称加密,借助 BouncyCastle 与 commons-codec 给出加解密代码示例,并解决 JDK 默认密钥强度限制(Illegal key size)问题。

    1 分钟阅读
  50. 我只是想开个饭店—— JavaIO模型的演变

    用一个开饭店的故事形象地讲解 Java IO 模型的演变:从一对一服务的 BIO 模型,到基于线程池的伪异步 IO,再到非阻塞的 NIO,对比各自的优劣。

    3 分钟阅读
  51. Please Call Me NIO

    介绍 Java NIO 的核心 API,包括 Path 与 Files 类的文件操作、文件的读写方法,以及通过将来式和回调式实现异步 IO 的使用方式。

    4 分钟阅读
  52. Hello Mybatis 04 使用spring-mybatis

    介绍 mybatis-spring 的整合配置,通过 SqlSessionTemplate 和 MapperScannerConfigurer 将 SqlSession 的管理交给 Spring,简化数据库操作。

    2 分钟阅读
  53. 简易的设计模式——单例模式

    讲解单例模式的定义与实现方式,通过国王与人民的 Java 示例演示如何保证一个类只有一个实例并向整个系统提供该实例,并总结其优缺点与应用场景。

    1 分钟阅读
  54. Hello Mybatis 03 数据关联

    讲解 Mybatis 中 resultMap 的用法,并通过 association 和 collection 标签实现一对一、一对多的数据关联查询。

    2 分钟阅读
  55. Hello Mybatis 02 mybatis generator

    介绍 mybatis generator 代码生成工具的配置与使用,通过 generatorConfig.xml 自动生成 vo 类、Dao 接口和 Mapper.xml,省去手写模板代码。

    1 分钟阅读
  56. Hello Mybatis 01 第一个CRUD

    从零开始搭建 Mybatis 环境,通过 User 表的增删改查示例,介绍 SqlSessionFactory、SqlSession 与 Mapper 的基本用法。

    3 分钟阅读
  57. 先学框架=不注重基础?

    从自身学习 Web 开发的经历出发,思考是否应该先学框架再回头看 servlet、jdbc 等基础,反思基础与框架学习的先后顺序与相互促进关系。

    3 分钟阅读
  58. java线程与并发(二)

    梳理 Java 线程的生命周期与常用操作,包括取得与设置线程名称、join、sleep、优先级等,并介绍 synchronized 关键字与同步代码块、同步方法的基本用法。

    2 分钟阅读
  59. java线程与并发(一)

    从操作系统的进程与线程说起,介绍 Java 实现多线程的两种方式:继承 Thread 类与实现 Runnable 接口,并通过示例说明二者在资源共享上的区别。

    2 分钟阅读