Ohhnews

分类导航

DZone Java

Java JEP 400解析:为何UTF-8成为默认字符集

JEP 400是Java开发工具包(JDK)的一项重要增强提案,自JDK 18(2022年发布)起,它将UTF-8标准化为Java的默认字符集。在此之前,Java的I/O API(如FileReader和FileWriter)在未明确指定字符集时,会依赖于操作系统的默认字符集,这导致了跨平台环境中的字符编码不一致和潜在的错误。JEP 400旨在解决这一长期存在的问题,通过统一使用UTF-8,使Java应用程序的行为更具可预测性,并显著提高其跨平台可靠性。尽管开发者仍可通过构造函数或JVM参数“-Dfile.encoding”来指定字符集,但UTF-8作为默认值,极大地简化了开发并减少了因编码差异导致的bug,确保了现代Java项目的更高一致性。
#java#jep 400#utf-8#字符集#jdk
$ more
Jetbrains Blog

Datalore Cloud八月特惠:新用户或升级享七折优惠

Datalore宣布在2025年8月期间,为新用户和试用版用户提供Datalore Cloud订阅服务七折优惠,截止日期为8月31日。Datalore Cloud提供高效的数据探索与团队协作工具,支持Python、SQL或无代码分析,并能分享笔记、报告和环境。其核心功能包括Datalore AI智能代码辅助、无代码自动化、可扩展计算和无限数据库集成。用户可通过结账时输入优惠码“DATALORE_CLOUD_25”享受此折扣。此优惠旨在鼓励用户升级,以便利用其全面的数据分析和协作功能。
#datalore cloud#优惠#数据分析#团队协作#ai辅助
$ more
foojay

Java中的领域驱动设计:实践指南

实践指南 本文通过构建一个机场运营系统,详细介绍了如何在Java和Spring Boot项目中实践领域驱动设计(DDD)。文章首先阐述了DDD的核心思想,如通用语言、有界上下文、实体、值对象、聚合、仓储、领域服务和工厂等概念,并将其与机场的实际运作相类比。随后,作者逐步指导读者如何创建Spring Boot项目,对机场领域进行建模,实现领域对象,划分有界上下文,并集成仓储和应用层,最终通过REST API暴露功能。文章还提供了完整的示例代码和Postman测试场景,旨在帮助开发者理解如何通过DDD构建与业务逻辑紧密结合、可维护且适应性强的企业级应用。
#领域驱动设计#java#spring boot#软件架构#企业应用
$ more
InfoQ Java

将AI融入Java应用

本文旨在为Java开发者提供将人工智能(AI)融入企业级应用所需的基础知识和技能。文章通过一个简单的星际旅行预订聊天机器人应用示例,详细介绍了如何利用LangChain4j和Quarkus等Java框架,高效地与大型语言模型(LLMs)进行交互,并构建满足用户需求的应用。重点讨论了LangChain4j如何简化LLM交互、管理聊天记忆以提高效率和降低成本,以及如何实现流式响应以提升用户体验。此外,文章还展示了如何从LLM的非结构化输出中生成结构化数据,从而更好地集成到Java代码中。文章强调,Java凭借其成熟、企业级的生态系统(包括性能、安全和可观察性),是开发和运行生产级AI应用的理想选择。通过掌握这些概念和技术,Java开发者可以走在AI快速发展的前沿,构建更智能、更具吸引力的应用。
#人工智能#java开发#大型语言模型#langchain4j#quarkus
$ more
Baeldung

Java中模拟函数指针的多种方法

概述 本文深入探讨了Java中如何模拟C/C++等语言的函数指针概念。尽管Java不直接支持函数指针,但可以通过多种技术实现类似的功能。文章详细介绍了七种主要方法: 接口与匿名类:适用于Java 8以前的版本或处理遗留代码。 Lambda表达式:Java 8及以上版本的推荐方式,提供简洁可读的语法。 内置函数式接口:如BiFunction,避免自定义接口,实现标准化。 方法引用:用于调用现有方法,语法更简洁。 反射:提供运行时动态调用能力,但性能较低且不具备编译时类型安全。 命令模式:将行为封装为独立对象,适用于需要排队、记录或参数化操作的场景。 基于枚举的功能行为:将相关操作逻辑集中到枚举中,适用于固定操作集。 文章还通过对比表格详细分析了这些方法的优缺点及适用场景,强调在现代Java开发中,Lambda表达式和内置函数式接口因其简洁性和可读性而成为首选,而其他方法则适用于特定需求或遗留系统。
#java#函数指针#lambda表达式#函数式接口#行为传递
$ more
Baeldung

Google Protobuf ByteString 与 Byte 数组:深入比较

本文深入探讨了在Java中使用Google Protocol Buffers (Protobuf)时处理二进制数据的两种主要类型:标准的byte和Protobuf自定义的ByteString类。文章详细阐述了它们在设计和用途上的根本差异。byte是可变的,适用于需要原地修改数据的场景,如内存缓冲区或流处理。而ByteString是不可变的,一旦创建内容便无法更改,这带来了线程安全和更高效率(尤其是在拼接操作中)的优势,并且它是Protobuf消息中bytes字段的本地类型,确保了无缝高效的序列化和反序列化。文章还提供了将两者相互转换的方法,并强调了转换过程中涉及的数据复制开销。最终建议,byte用于可变、通用目的的缓冲区,而ByteString则应作为Protobuf消息中所有二进制数据的默认选择。
#protobuf#bytestring#字节数组#java#二进制数据
$ more
Baeldung

使用Java执行mTLS调用

Java mTLS 调用指南 本文详细介绍了如何在Java应用程序中执行相互传输层安全(mTLS)调用。文章首先概述了mTLS协议,强调其在客户端和服务器之间进行双向身份验证的重要性,特别适用于高安全环境。接着,文章指导读者如何使用OpenSSL工具生成自签名证书,包括证书颁发机构(CA)、服务器和客户端证书。随后,详细说明了如何配置Nginx服务器以启用mTLS,包括设置SSL证书、密钥和客户端证书验证。最后,文章展示了如何在Java客户端中构建SSLContext,并使用Java内置的HttpClient和HttpsURLConnection类来与启用mTLS的Nginx服务器进行通信,确保了通信的安全性。
#mtls#java#nginx#网络安全#客户端认证
$ more
Baeldung

使用 Spring Modulith 实现 CQRS 模式

CQRS与Spring Modulith的实现 本文深入探讨了如何在模块化的Spring Boot应用中实现命令查询职责分离(CQRS)模式。通过利用Spring Modulith,文章展示了如何将代码结构化为清晰分离的模块,并通过异步、事件驱动的领域事件实现模块间的通信。这种方法确保了命令(写入)端和查询(读取)端之间的数据最终一致性。文章以电影票预订系统为例,详细阐述了命令端如何处理票务预订和取消,以及查询端如何通过监听领域事件更新数据并提供查询服务。尽管带来了关注点分离和可伸缩性等优势,但也伴随着复杂性增加和最终一致性的挑战。Spring Modulith在此过程中还提供了模块边界验证和事件外部化等功能。
#cqrs#spring modulith#spring boot#领域事件#模块化架构
$ more
Baeldung

在Spring Boot中注册ServletContextListener

本文探讨了如何在Spring Boot应用中注册ServletContextListener。ServletContextListener是一个Java Servlet API接口,用于在应用启动和关闭时执行特定操作,如初始化资源或清理任务。文章介绍了两种主要的注册方法:一是结合使用@WebListener注解和@ServletComponentScan,这种方式更接近传统的Java EE模式;二是使用ServletListenerRegistrationBean,这是Spring Boot推荐的原生方式,因为它更加灵活且不依赖于Servlet API扫描。文章强调,对于新的Spring Boot应用或代码迁移,ServletListenerRegistrationBean是更优的选择。
#servletcontextlistener#spring boot#servlet api#应用生命周期#注册方法
$ more
Spring Blog

Spring Data 2025.0.3 和 2024.1.9 版本发布

Spring Data 2025.0.3 和 2024.1.9 版本发布 Spring Data 团队宣布发布 2025.0.3 和 2024.1.9 服务版本。这些版本主要包含依赖升级、回归错误修复和部分改进。更新涵盖了 Spring Data Commons、JPA、Neo4j、Apache Cassandra、MongoDB、KeyValue、LDAP、REST、Redis、Elasticsearch、Couchbase 和 Relational 等多个核心模块。即将发布的 Spring Boot 版本也将集成这些重要的更新。
#spring data#版本发布#软件更新#数据管理#java开发
$ more