JAVA - record

Java 14 引入并在 Java 16 中正式稳定的 record 是一种新型类,用于定义不可变数据载体,简化“数据类”的定义。record 自动生成所有字段的 private final 声明、构造函数、getters 方法(字段名同名)、以及 toString()、equals() 和 hashCode() 方法。适用于仅需存储数据而无需大量样板代码(如构造函数、getter、toString 等)的场景。例如,创建一个 `Person` record 类,其中包含地址和年龄信息,可以轻松实现数据封装与访问,同时保持对象的不可变性。

liujie Published on 2025-04-21

浅谈Spring中的@EventListener和@TransactionalEventListener

文章讨论了在Spring框架中使用发布/订阅模式时遇到的问题及解决方案。初始示例展示了如何利用`@EventListener`实现用户注册后自动分配顾问的功能,但发现该方法与用户注册事务绑定在一起,导致业务逻辑未能完全解耦。为了解决这个问题,文章介绍了`@TransactionalEventListener`注解,它允许更灵活地控制事件监听器的执行时机,如事务提交后(默认)、回滚后或完成时。通过设置`Propagation.REQUIRES_NEW`开启新事务,可以确保即使原事务已提交,监听器中的数据操作仍能正常进行。此外,对于耗时较长的操作,还可以结合`@Async`注解异步处理。总之,`@TransactionalEventListener`提供了一种有效的方法来增强发布/订阅模式下的事务管理能力。

liujie Published on 2023-11-01

springboot jar包, java -jar启动时报错:xx.jar中没有主清单属性

文章讨论了在SpringBoot架构下搭建的父子工程项目中遇到的问题:尽管项目能在IDEA中正常启动,但在将项目打包成jar文件并通过jar方式启动时,会遇到“没有主清单属性”的错误。该问题的根本原因在于jar包中未指定Main-Class,导致系统无法找到入口点以执行程序。为解决此问题,作者建议在子工程的pom.xml文件中配置spring-boot-maven-plugin插件,并设置repackage目标,这一步骤能确保生成的jar包不仅包含应用代码和依赖项,还正确设置了MANIFEST.MF文件中的Start-Class或Main-Class字段,从而让SpringBoot应用程序能够独立运行。

liujie Published on 2023-08-26

OpenFeign

OpenFeign是一种声明式、模板化的HTTP客户端,广泛应用于Spring Cloud中,使得开发者可以像调用本地方法一样访问远程服务。它通过与Ribbon或Eureka集成来实现负载均衡。文章提供了ServiceA和ServiceB之间的调用示例,包括Controller定义、启动类配置及Feign客户端的创建等步骤,并展示了如何使用配置文件设置超时时间和服务属性。此外,还介绍了OpenFeign的工作原理,即通过动态代理技术生成HTTP请求接口的实现类,以及其与Ribbon集成实现负载均衡的过程。最后,讨论了代理模式(特别是动态代理)的概念及其在Java中的两种主要实现方式:JDK动态代理和CGLIB代理,指出了各自的优缺点。

liujie Published on 2023-08-15

JDK1.8 HashMap源码分析

本文详细解析了JDK 1.8版本中HashMap的源码实现。首先介绍了HashMap的基本结构,包括数组+链表+红黑树的数据组织方式,接着深入探讨了重要属性如容量、负载因子等的作用与意义。文章还全面分析了HashMap的核心方法,如put()、get()、resize()等的工作原理及其优化策略。特别强调了JDK 1.8相较于之前版本在处理哈希冲突时引入红黑树机制以提高查询效率的变化。通过对比不同版本之间的差异,展示了Java集合框架持续演进的过程。最后,对常见问题进行了总结,并给出了一些使用建议,帮助开发者更好地理解和运用HashMap。

liujie Published on 2023-05-12