Java

浏览该分类下的所有文章

SpringBoot结合ip2region实现博客评论显示IP属地

本文介绍在Spring Boot博客系统中使用ip2region实现评论IP属地显示的完整方案。通过IpParseUtil类的getIpAddr获取请求IP,再用parse方法解析为“国家|区域|省份|城市|ISP”或自定义字段列表。将解析结果写入Comment实体的location字段,在前端页面读取并展示。文章还列出所需技术栈(Spring Boot、MySQL、HTML/CSS/JS、ip2region、Commons IO、Lombok)以及关键代码实现和集成步骤,帮助开发者快速为评论添加地理位置信息,提高互动体验。

实现异步天气数据获取与Spring缓存集成

本文介绍在 Spring Boot 中通过 @Async 实现天气数据的异步获取,并使用 @Cacheable 将结果缓存,降低对高德天气 API 的重复调用。示例代码演示了获取客户端 IP、解析地区、调用高德地理编码和天气接口、处理返回数据并把天气信息写入模型。文中说明了自定义 IP 解析工具、API Key 替换、RestTemplate/ WebClient 选择以及项目需引入 Spring Cache 与 Spring Web 的前置条件。结合异步与缓存后,可提升响应速度、减轻服务器负载、改善用户体验。

Java 17 新功能介绍(LTS)

2021 年 9 月 14 日发布的 Java 17 是长期支持(LTS)版,带来 14 项新特性:恢复始终严格的浮点语义;新增统一的 RandomGenerator 接口与工厂;在 macOS 上采用 Apple Metal 渲染并支持 AArch64 架构;删除已废弃的 Applet API;加强 JDK 内部封装,取消 --illegal-access 选项;预览 Switch 模式匹配;移除 RMI Activation;正式推出密封类;剔除实验性的 AOT/JIT 编译器;弃用 Security Manager;孵化外部函数与内存 API;二次孵化 Vector API;以及支持基于上下文的反序列化过滤器。全文提供下载链接与官方文档,属 Java 新特性教程系列。

SpringBoot+Elasticsearch按日期实现动态创建索引

文章介绍了在 SpringBoot 中通过 @Document 的 EL 表达式实现 Elasticsearch 按日期动态创建索引的完整方案。核心思路是把索引后缀(如 yyyy_MM_dd)封装为 Bean(esIndex),并在每天零点的定时任务中销毁旧 Bean、重新注册新值,同时手动调用 ElasticsearchRestTemplate 创建索引,以保证 shards、replicas 等配置不丢失。实体类需声明 createIndex = false,避免自动创建导致参数缺失;示例代码包括配置类、实体、Repository 与 Controller,演示了定时更新索引和保存数据后在 Kibana 中观察新索引的效果。

HTML集成优雅的实时输入清除功能

本文介绍了在网页表单中实现实时输入清除的完整方案。通过在输入框右侧嵌入一个隐藏的“×”图标(HTML + <span>),利用 CSS 将图标定位于输入框内部,并通过 JavaScript 监听 input、focus、blur 等事件,在有内容时显示图标、点击后清空文本并隐藏图标。实现步骤简洁、代码可复用,能够提升表单的交互便利性和整体用户体验。

PageHelper结合Lambda表达式实现简洁的分页封装

本文演示了在Spring Boot 项目中通过引入 `pagehelper‑spring‑boot‑starter`,结合 Java Lambda 表达式,实现统一、简洁的分页封装。首先定义 `BaseQueryParam` 只包含 `pageNum`、`pageSize`,供所有查询继承;随后实现通用的 `NewPageBean<T>`,在 `generatePage` 方法中使用 `PageHelper.startPage(...).doSelectPage(ISelect)` 通过 Lambda 调用 Mapper,自动返回 `total`、`list` 与 `MyPage`(页码、页大小、总页数、前后页)等分页信息。示例代码展示了 `TaskMapper`、对应 XML 与 `TaskController` 的调用方式,访问 `http://localhost:9090/demo/test?pageNum=2&pageSize=2` 即可得到结构化的分页响应。整个方案实现了分页逻辑的高度复用与代码简化。

装饰者模式

装饰者模式是一种结构型设计模式,通过在运行时为对象动态添加新功能而不修改原类。实现步骤包括:定义Component接口;实现ConcreteComponent;创建实现Component并持有Component引用的抽象Decorator;在ConcreteDecoratorA、ConcreteDecoratorB等具体装饰者中扩展operation方法添加新行为。客户端可通过把装饰者层层包装ConcreteComponent,实现灵活组合行为,体现了装饰者模式在不影响原有对象的前提下增强功能的优势。

单例模式

单例模式旨在保证一个类只有唯一实例并提供全局访问点。文中介绍了五种常见实现:①懒汉式(非线程安全);②同步懒汉式(通过synchronized保证安全);③双重检查锁定(在必要时同步,性能更佳);④饿汉式(类加载即实例化,天然线程安全);⑤枚举实现(简洁且安全)。每种方案适用于不同的并发需求,开发者应依据实际场景选择最合适的实现方式。

Java并发编程:从volatile关键字到Atomic类的底层原理与实战

本文阐述了 Java 并发中的两种可见性与原子性保障手段。volatile 关键字通过强制读写主内存、禁止指令重排,实现变量的即时可见,适用于单一状态标记等轻量读写场景;而 java.util.concurrent.atomic 包提供的 Atomic 类利用硬件层面的 CAS 无锁算法,确保复合操作的原子性,避免 synchronized 的锁开销,适合计数、递增等高并发写场景。文章通过代码示例演示两者的使用方式,并对 volatile 与 Atomic 在适用场景、性能和数据一致性方面进行对比,强调在实际开发中需根据业务需求权衡选择,以实现高效且安全的并发控制。

Java并发工具类:从CountDownLatch到CyclicBarrier的实战应用

本文系统阐述了 Java 并发包中的两大同步工具——CountDownLatch 与 CyclicBarrier。CountDownLatch 通过计数器让一个或多个线程等待指定次数的任务完成后再继续,适用于“一次性”任务汇总;示例展示了主线程阻塞直至三个子线程调用 countDown()。CyclicBarrier 则让一组线程在同一屏障点相互等待,计数归零后所有线程一起放行,并且可以循环使用,适合多轮协同处理;示例演示了三条线程在 barrier.await() 后同步继续。文章比较了两者的设计理念与使用场景,强调掌握这些工具可提升 Java 并发程序的效率和可靠性。

Java 11的新特性与最佳实践

Java 11作为LTS版本,重点推出了三大新特性:全异步的java.net.http.HttpClient 替代阻塞的HttpURLConnection;DateTimeFormatter 的 parse 方法简化 LocalDate、LocalTime、LocalDateTime 的字符串解析;以及低延迟的 ZGC 垃圾回收器,提升长时运行应用的响应。文章还提出使用 Java 11 时的最佳实践:确保依赖兼容、利用 JFR 等工具监控性能、定期代码审查并持续学习社区新动态,以充分发挥新 API 与工具带来的开发效率和性能提升。

Nginx线上配置https示例文件

本文提供了一个完整的 Nginx HTTPS 配置示例。全局设置包括日志、连接数、文件发送等;在 `http` 块中定义日志格式和基本参数。`server` 块一监听 443 并启用 SSL,指定域名、证书路径、私钥,并通过 `proxy_pass` 将请求转发至后端 IP+端口,同时设置真实 IP 头。另设 80 端口 `server`,使用 `rewrite` 永久重定向所有请求到 HTTPS。最后通过 `include /etc/nginx/conf.d/*.conf` 加载其他配置文件。