You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Lombok确保单例模式下相同对象的HashCode一致?

解决单例Bean哈希值不一致及Lombok使用问题

首先明确一个关键:Spring单例Bean的本质是同一个实例被注入到所有依赖位置,正常情况下service1和service2应该是同一个对象,它们的默认hashCode()必然相同,根本不需要重写equals/hashCode方法。你遇到的哈希值不同的问题,根源不是Lombok的使用,而是Spring Bean的配置或注入逻辑出了问题。

问题根源排查

你的代码中,PaymentConfiguration只定义了一个单例PaymentService Bean,但注入的service1和service2哈希值不同,说明容器里存在两个独立的PaymentService实例,违背了单例预期,可能的原因:

  • PaymentService类被误加了@Component/@Service注解,导致Spring自动创建了额外的Bean实例。
  • PaymentConfiguration不在Spring的扫描范围内(@SpringBootApplication默认扫描当前包及子包),Spring没有加载这个配置类,转而通过反射每次注入都生成新实例。
  • 存在其他配置类也定义了PaymentService的@Bean方法,导致多Bean冲突。

核心解决方案:确保真正的单例

解决了单例问题,service1和service2自然是同一个实例,哈希值必然一致:

  1. 清理多余的Bean定义:移除PaymentService类上的任何@Component/@Service注解(如果存在),确保只有PaymentConfiguration中的@Bean方法负责创建实例。
  2. 保证配置类被扫描:将PaymentConfiguration放到DemoApplication的同包或子包下,或者通过@SpringBootApplication(scanBasePackages = "你的配置类所在包路径")指定扫描范围。
  3. 验证单例有效性:运行代码后查看service2.getAmount()的输出,如果是100(和service1设置的值一致),说明是同一个实例,哈希值也会相同。

若需属性相同时哈希值一致(非单例场景)

如果你确实需要保留多个实例,但希望属性完全相同时哈希值一致,可以通过Lombok实现:
在PaymentService类上添加@EqualsAndHashCode注解,Lombok会自动基于所有非静态、非transient属性生成equals和hashCode方法:

@Getter
@Setter
@EqualsAndHashCode
public class PaymentService {
    private long amount;
    private String paymentStatus;
}

此时只要service1和service2的amount和paymentStatus完全相同,它们的hashCode()就会一致。但注意:这只是属性层面的一致,并非真正的单例,不符合你最初的单例设计需求,仅作为特殊场景的补充方案。


内容的提问来源于stack exchange,提问作者expelliarmus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:45:41