news 2026/5/22 23:20:43

【Spring】Lombok

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Spring】Lombok

Lombok

  • Quick Start Example for Lombok
  • 引入依赖与 IDE 配置
  • 核心注解详解
    • @Data
    • @Getter 和 @Setter
    • @ToString
    • @EqualsAndHashCode
    • @Builder
    • @AllArgsConstructor 和 @NoArgsConstructor
    • @Value
    • @Slf4j / @Log / @Log4j2
    • @With
  • 原理浅析

Quick Start Example for Lombok

在日常开发中,总会写大量的POJO(如MessageInfoUserOrder),而这些类几乎都要写 getter、setter、toStringequalshashCode代码量不小,逻辑却千篇一律,纯属体力活。

Lombok 的出现正是为了终结这种冗余。它通过一组简单的注解,在编译期自动生成那些样板方法,让源码只保留核心的字段声明,清晰且高效。

importlombok.Data;@DatapublicclassMessageInfo{privateStringfrom;privateStringto;privateStringmessage;}

仅此几行,一个功能完备的 POJO 就完成了。

引入依赖与 IDE 配置

使用 Lombok 前需要先将依赖引入项目,并确保开发环境正确识别。

Maven

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope></dependency>

Gradle

compileOnly'org.projectlombok:lombok:1.18.30'annotationProcessor'org.projectlombok:lombok:1.18.30'

小贴士:依赖引入后,务必在 IDE 中安装 Lombok 插件(如 IntelliJ IDEA 的Lombok插件),并开启Enable annotation processing,否则 IDE 会误报找不到方法。对于 Maven/Gradle 编译,开启注解处理器即可。

核心注解详解

Lombok 提供了一系列注解,组合使用可以应对绝大多数场景。其中最核心、最常用的是@Data

@Data

@Data是一个组合注解,把它加在类上,相当于同时应用了以下五个注解:

注解作用
@Getter为所有字段生成 getter 方法
@Setter为所有非 final 字段生成 setter 方法
@ToString生成包含所有字段的toString()方法
@EqualsAndHashCode生成基于所有非静态非瞬态字段的equals(Object)hashCode()方法
@RequiredArgsConstructorfinal字段或有@NonNull约束的字段生成构造器(若没有这类字段,则生成一个公开的无参构造器)

对于最初的MessageInfo,编译后等价于手写了如下代码:

publicclassMessageInfo{privateStringfrom;privateStringto;privateStringmessage;publicMessageInfo(){}publicStringgetFrom(){returnfrom;}publicvoidsetFrom(Stringfrom){this.from=from;}publicStringgetTo(){returnto;}publicvoidsetTo(Stringto){this.to=to;}publicStringgetMessage(){returnmessage;}publicvoidsetMessage(Stringmessage){this.message=message;}@OverridepublicStringtoString(){...}@Overridepublicbooleanequals(Objecto){...}@OverridepublicinthashCode(){...}}

用类图直观展示@DataMessageInfo自动添加的公开方法:

MessageInfo

-String from

-String to

-String message

+MessageInfo()

+getFrom() : String

+setFrom(String from) : void

+getTo() : String

+setTo(String to) : void

+getMessage() : String

+setMessage(String message) : void

+toString() : String

+equals(Object o) : boolean

+hashCode() : int

所有方法均已存在,可直接使用:

MessageInfomsg=newMessageInfo();msg.setFrom("Alice");msg.setTo("Bob");msg.setMessage("Hello Lombok!");System.out.println(msg.getFrom());// AliceSystem.out.println(msg);// MessageInfo(from=Alice, to=Bob, message=Hello Lombok!)

可将原来的列表结构拆分为独立的小章节,每个注解一节,内容适当扩写,示例如下(直接替换原### 3.2 其他宝藏注解整节即可):

已将“注解可作用于类或字段”这一重要说明补充到了文章中,主要在@Getter 和 @Setter小节展开,并略微提及了其他注解的类似特性。以下是更新后的3.2 其他宝藏注解完整内容:

@Getter 和 @Setter

可作用在字段上,单独控制读写方法的生成。放在类上,会为所有字段生成 getter/setter;放在单个字段上,则只针对该字段生成。还支持通过AccessLevel设置访问级别。

publicclassUser{@Getter@SetterprivateStringname;// 仅为 name 生成@Setter(AccessLevel.PROTECTED)privateStringpassword;// 生成 protected setter}

类似地,像@ToString.Exclude@EqualsAndHashCode.Exclude这样的辅助注解也可以直接标在字段上,用来精准排除某些字段,而不必在类注解里用字符串指定字段名。

@ToString

生成toString()方法。可通过exclude排除敏感字段,或用of指定仅包含某些字段。也可以直接在字段上添加@ToString.Exclude达到相同目的。

@ToString(exclude="password")publicclassUser{privateStringname;@ToString.ExcludeprivateStringpassword;}

@EqualsAndHashCode

控制参与相等性比较的字段,同样支持excludeof,也支持在字段上使用@EqualsAndHashCode.Exclude。在继承关系中,务必设置callSuper = true来调用父类的实现,避免破坏对称性。

@EqualsAndHashCode(callSuper=true)publicclassEmployeeextendsPerson{privateStringempId;}

@Builder

为类生成建造者模式,优雅构造复杂对象,尤其适用于多参数且部分可选的场景。

@BuilderpublicclassOrder{privateStringid;privateStringcustomer;privateBigDecimalamount;}// 使用Orderorder=Order.builder().id("1001").customer("Alice").amount(newBigDecimal("99.99")).build();

@AllArgsConstructor 和 @NoArgsConstructor

分别生成全参构造器无参构造器。常与@Data搭配,满足序列化框架(如 Jackson)对无参构造器的需求。

@Data@NoArgsConstructor@AllArgsConstructorpublicclassUser{privateStringname;privateintage;}

@Value

不可变数据类的一站式注解,相当于@Data的不可变版本。所有字段默认private final,只会生成 getter,不会生成 setter,同时生成toStringequalshashCode。适合定义值对象。

@ValuepublicclassAddress{Stringcity;Stringstreet;}

@Slf4j / @Log / @Log4j2

直接在类中注入日志对象,省去冗长的声明代码,支持主流日志框架。

@Slf4jpublicclassSomeService{publicvoiddoSomething(){log.info("doing something...");}}

@With

为字段生成withXxx方法,返回一个修改了指定字段值的新对象,原对象保持不变,非常适合配合不可变对象使用。

@With@ValuepublicclassPoint{intx,y;}Pointp=newPoint(1,2);Pointp2=p.withX(10);// p2: (10,2),p 不变

原理浅析

Lombok 并非运行时动态代理,而是在Java 编译过程中对抽象语法树(AST)动手脚。它的工作流程如下:

.java 源文件

编译器 javac 解析

生成抽象语法树 AST

Lombok
注解处理器

识别 @Data 等注解

在 AST 中注入
getter/setter 等方法节点

编译器基于修改后的 AST
生成 .class 字节码

JVM 运行

具体而言,Lombok 利用了 Java 6 引入的JSR 269 可插拔注解处理 API,直接参与javac的编译过程。在生成 AST 之后、产出字节码之前,Lombok 的处理器会扫描 AST,找到带有自身注解的节点,然后动态插入相应的方法节点。整个过程发生在编译期,对运行时零侵入,也不会带来任何性能损耗。最终生成的.class文件与手写完全一致。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 23:12:09

OpenStack网络管理-neutron

OpenStack网络管理-neutron 物理网络与虚拟网络区别Switch&#xff1a;物理交换机 vSwitch&#xff1a;虚拟交换机 NIC&#xff1a;网络接口卡、网络适配器、网卡 vNIC&#xff1a;虚拟网卡 Linux网络虚拟化技术 网卡虚拟化&#xff1a; TAP TUN VETH PAIR 交换机虚拟化&#x…

作者头像 李华
网站建设 2026/5/22 23:11:40

技术人的黄金十年:软件测试从业者25到35岁每一年该怎么规划?

对于每一位进入软件行业的技术人而言&#xff0c;25岁到35岁这十年几乎决定了整个职业生涯的上限&#xff0c;而软件测试作为产品质量的最后一道防线&#xff0c;这个岗位的能力积累、职业路径选择&#xff0c;更需要在这黄金十年里做好清晰的规划。不同于开发岗的技术迭代焦虑…

作者头像 李华
网站建设 2026/5/22 23:11:34

从年薪20万到50万,测试工程师的薪资跃迁节点全解析

对于绝大多数刚进入互联网行业的测试工程师来说&#xff0c;年薪20万是一个很现实的起步门槛——工作3年左右、掌握基础功能测试技能、能独立负责模块测试&#xff0c;在一二线城市拿到这个薪资并不算难。但想要从20万突破到50万&#xff0c;却不是靠熬年限、加加班就能实现的。…

作者头像 李华
网站建设 2026/5/22 23:06:40

量子损失函数优化中的噪声注入技术解析

1. 量子损失函数优化的挑战与噪声注入原理 量子变分算法(VQA)和量子机器学习(QML)模型的核心挑战在于其高度非凸的损失函数景观。就像在崎岖的山地中寻找最低点&#xff0c;传统优化方法常常陷入局部极小值而无法找到全局最优解。这种现象的根源在于量子损失函数的傅里叶展开中…

作者头像 李华
网站建设 2026/5/22 23:03:01

ARM架构随机数生成机制与安全应用实践

1. ARM架构随机数生成机制深度解析 在计算机安全领域&#xff0c;高质量的随机数生成是加密算法、密钥生成和安全协议的基础支撑。ARMv8/v9架构通过FEAT_RNG&#xff08;Random Number Generation&#xff09;特性提供了硬件级的随机数生成支持&#xff0c;其设计遵循严格的密码…

作者头像 李华
网站建设 2026/5/22 22:53:44

机器学习赋能粒子物理全局拟合:破解B介子衰变反常之谜

1. 项目概述&#xff1a;当粒子物理遇上机器学习 如果你在粒子物理领域&#xff0c;特别是味物理和超出标准模型&#xff08;BSM&#xff09;物理的探索前线工作过&#xff0c;那么对“全局拟合”这个词一定不会陌生。它就像是我们理论家和实验家之间的翻译官&#xff0c;把对撞…

作者头像 李华