恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Lombok 引入与使用详解

  • 首页
  • 资讯中心
  • /
  • Lombok 引入与使用详解

相关资讯

基于UNet的遥感影像语义分割实战:源码解析与避坑指南 2026/10/1 23:54:17
马德拉岛深度旅行攻略:玩法、美食与避坑指南 2026/10/1 23:54:17
Unity 渲染管线选型:URP 与 HDRP 实操、性能优化及迁移避坑 2026/10/1 23:54:17

最新资讯

Linux上下文切换深度解析:从进程上下文到中断上下文的性能真相
低功耗物联网硬件选材实战:从主控到传感器的选型与避坑
开源模拟赛车座舱全解析:4040铝型材DIY方案设计与实战避坑指南
海康萤石云接入全链路:accessToken、设备归属与直播播放
基于S7-200和组态王的游泳池水处理PLC控制系统设计
TFLite内存规划器深度解析:从原理到实战优化

今日推荐

企业AI转型实战指南:从场景选择到落地避坑的完整路线图
OpenRig:本地大模型服务编排的轻量级运行时框架
夸克网盘1TB免费扩容领取全攻略:新老用户实操流程与避坑指南

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Lombok 引入与使用详解

发布时间:2026/10/1 23:54:17
Lombok 引入与使用详解 Lombok 引入与使用详解一、Lombok 是什么Lombok 是一个 Java 库通过注解在编译期自动生成代码减少 getter、setter、构造方法、toString、equals、hashCode 等样板代码的编写。它不是一个运行时框架而是一个编译期注解处理器。你在类上写一个Data编译后的字节码里就自动包含了所有 getter、setter、toString、equals、hashCode。源代码看起来干净运行时功能完整。二、为什么需要 Lombok一个普通的 POJO 类三个字段手写 getter、setter、构造方法、toString代码量大约 50 行。用 Lombok 后DatapublicclassUser{privateLongid;privateStringname;privateStringemail;}六行代码完成同样的功能。字段越多差距越明显。Lombok 的价值在于减少重复代码让类只保留核心字段定义修改字段名时不需要同步修改 getter/setter代码更短可读性更高减少手写方法时的遗漏和错误三、引入 Lombok1. Maven 依赖dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.30/versionscopeprovided/scope/dependency如果继承了spring-boot-starter-parent版本可以省略dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencyscope用provided或optional都可以表示编译时需要打包时不传递到最终产物。2. Gradle 依赖compileOnly org.projectlombok:lombok:1.18.30 annotationProcessor org.projectlombok:lombok:1.18.303. IDEA 插件Lombok 需要在 IDEA 中安装插件否则 IDEA 无法识别生成的 getter/setter会报“找不到方法”的错误。安装步骤File → Settings → Plugins搜索Lombok安装并重启 IDEA新版本 IDEA 已内置 Lombok 支持但仍建议确认插件已启用。4. 启用注解处理Settings → Build, Execution, Deployment → Compiler → Annotation Processors勾选Enable annotation processing。四、常用注解详解1. Getter / Setter为字段生成 getter 和 setter 方法。GetterSetterpublicclassUser{privateLongid;privateStringname;}可以标注在类上所有字段生效或字段上仅该字段生效。控制访问权限Getter(AccessLevel.PROTECTED)privateStringpassword;2. ToString生成toString()方法。ToStringpublicclassUser{privateLongid;privateStringname;}输出User(id1, name张三)排除字段ToString(excludepassword)publicclassUser{privateLongid;privateStringpassword;}调用父类 toStringToString(callSupertrue)publicclassUserextendsBaseEntity{}3. EqualsAndHashCode生成equals()和hashCode()方法。EqualsAndHashCodepublicclassUser{privateLongid;privateStringname;}排除字段EqualsAndHashCode(excludename)调用父类EqualsAndHashCode(callSupertrue)4. Data组合注解等价于GetterSetterToStringEqualsAndHashCodeRequiredArgsConstructorDatapublicclassUser{privateLongid;privateStringname;privateStringemail;}这是最常用的注解一个Data覆盖了 POJO 的大部分需求。注意Data生成的equals()和hashCode()包含所有字段在 JPA 实体类中可能触发懒加载异常。JPA 实体建议用Getter、Setter、ToString单独组合。5. NoArgsConstructor生成无参构造方法。NoArgsConstructorpublicclassUser{}JPA 实体类需要无参构造方法配合Data使用DataNoArgsConstructorAllArgsConstructorpublicclassUser{privateLongid;privateStringname;}6. AllArgsConstructor生成包含所有字段的构造方法。AllArgsConstructorpublicclassUser{privateLongid;privateStringname;}等价于publicUser(Longid,Stringname){this.idid;this.namename;}配合Builder使用时AllArgsConstructor是 Builder 能工作的前提。7. RequiredArgsConstructor生成包含final字段和NonNull字段的构造方法。Spring 构造器注入的常用方式。ServiceRequiredArgsConstructorpublicclassUserService{privatefinalUserDaouserDao;privatefinalEmailServiceemailService;}编译后等价于publicUserService(UserDaouserDao,EmailServiceemailService){this.userDaouserDao;this.emailServiceemailService;}Spring 4.3 之后如果类只有一个构造方法可以省略Autowired。RequiredArgsConstructor生成的构造方法正好满足这个条件所以构造器注入可以写成这样非常简洁。8. Builder生成建造者模式代码。BuilderpublicclassUser{privateLongid;privateStringname;privateStringemail;}使用UseruserUser.builder().id(1L).name(张三).email(zhangsanexample.com).build();Builder适合字段较多的对象比多参数构造方法更清晰比多个 setter 更安全。9. Slf4j生成日志对象log。Slf4jServicepublicclassUserService{publicvoidgetUser(Longid){log.info(查询用户id: {},id);log.debug(调试信息);log.error(错误信息,exception);}}等价于privatestaticfinalLoggerlogLoggerFactory.getLogger(UserService.class);其他日志注解Logjava.util.logging、Log4j2Log4j2、CommonsLogCommons Logging。10. NonNull标记字段或参数不能为 nullLombok 会在 setter 和构造方法中生成判空检查。publicclassUser{NonNullprivateStringname;}编译后 setter 会自动检查publicvoidsetName(NonNullStringname){if(namenull){thrownewNullPointerException(name is marked non-null but is null);}this.namename;}11. Value生成不可变类等价于GetterAllArgsConstructorToStringEqualsAndHashCodeFieldDefaults(makeFinaltrue,levelAccessLevel.PRIVATE)ValuepublicclassPoint{intx;inty;}所有字段变为private final只有 getter没有 setter。12. Cleanup自动关闭资源生成 try-finally 代码。publicvoidreadFile()throwsIOException{CleanupInputStreamisnewFileInputStream(file.txt);// 使用 is方法结束时自动关闭}等价于InputStreamisnewFileInputStream(file.txt);try{// 使用 is}finally{is.close();}13. SneakyThrows偷偷抛出受检异常不需要在方法签名上声明。SneakyThrowspublicvoidreadFile(){Files.readAllLines(Paths.get(file.txt));// 不需要 throws IOException}这个注解有争议因为它绕过了 Java 的受检异常检查机制。建议谨慎使用仅在确实需要时使用。五、Lombok 在 Spring 项目中的典型组合1. DTO / VODataNoArgsConstructorAllArgsConstructorpublicclassUserDTO{privateLongid;privateStringname;privateStringemail;}2. JPA 实体EntityGetterSetterNoArgsConstructorAllArgsConstructorToString(excludeorders)publicclassUser{IdGeneratedValue(strategyGenerationType.IDENTITY)privateLongid;privateStringname;OneToMany(mappedByuser)privateListOrderorders;}JPA 实体避免用Data因为equals()和hashCode()包含所有字段可能触发懒加载。3. Service 层ServiceRequiredArgsConstructorSlf4jpublicclassUserService{privatefinalUserDaouserDao;privatefinalEmailServiceemailService;publicUsergetUser(Longid){log.info(查询用户id: {},id);returnuserDao.findById(id);}}4. Builder 模式的配置类BuilderGetterToStringpublicclassAppConfig{privateStringappName;privateinttimeout;privateListStringservers;}六、Lombok 的底层原理Lombok 通过JSR 269 注解处理器Annotation Processor在编译期修改抽象语法树AST。编译流程javac 解析源文件生成 AST。Lombok 的注解处理器被触发扫描 AST 中的 Lombok 注解。根据注解元数据在 AST 中插入新的方法节点getter、setter、构造方法等。javac 继续处理修改后的 AST生成包含新方法的字节码。所以 Lombok 生成的方法在源码中不可见但在字节码和运行时是真实存在的。这也是为什么 IDEA 需要安装插件——IDE 的代码分析和补全需要感知 Lombok 生成的方法否则会误报“方法不存在”。七、常见问题1. IDEA 报错找不到 getter/setter确认已安装 Lombok 插件确认已启用注解处理Annotation Processing重启 IDEA 或执行mvn clean compile2. Data 在 JPA 实体中的坑Data生成的equals()和hashCode()包含所有字段在多对多、懒加载场景下可能触发意外的 SQL 查询。JPA 实体建议用Getter Setter NoArgsConstructor组合。3. Builder 与继承Builder不处理父类字段。子类使用 Builder 时父类字段需要SuperBuilderSuperBuilderpublicclassBaseEntity{privateLongid;}SuperBuilderpublicclassUserextendsBaseEntity{privateStringname;}4. ToString 循环引用两个对象互相引用时ToString会无限递归导致栈溢出。需要在某一方排除字段ToString(excludeuser)publicclassOrder{privateUseruser;}5. Lombok 版本与 JDK 版本兼容Lombok 对 JDK 版本有要求。JDK 17 需要 Lombok 1.18.22 以上JDK 21 需要 Lombok 1.18.30 以上。升级 JDK 时同步升级 Lombok。6. 编译报错找不到符号cannot find symbol: method getName()通常是注解处理器没有生效。检查 IDEA 的 Annotation Processing 是否启用或执行mvn clean compile重新编译。八、最佳实践POJO、DTO、VO 用Data或Getter Setter代码量大幅减少JPA 实体用Getter Setter NoArgsConstructor AllArgsConstructor避免Data的 equals/hashCode 问题Service 层用RequiredArgsConstructorSlf4j构造器注入和日志一步到位字段较多的对象用Builder构建过程更清晰敏感字段用ToString.Exclude排除避免密码泄露到日志团队统一 Lombok 版本避免不同环境编译结果不一致不要过度依赖SneakyThrows受检异常的存在是有意义的九、总结注解作用常用场景Data组合getter、setter、toString、equals、hashCodePOJO、DTOGetter/Setter生成 getter / setterJPA 实体ToString生成 toString日志调试EqualsAndHashCode生成 equals / hashCode集合中的对象NoArgsConstructor无参构造方法JPA 实体AllArgsConstructor全参构造方法配合 BuilderRequiredArgsConstructorfinal 字段构造方法Spring 构造器注入Builder建造者模式字段多的对象Slf4j生成日志对象Service、ControllerNonNull判空检查必填字段Value不可变类值对象Cleanup自动关闭资源IO 操作Lombok 是 Spring 开发中提升效率的利器。它把重复的样板代码从源码中移除让类只保留核心字段定义。在 Spring Boot 项目中Data、RequiredArgsConstructor、Slf4j、Builder这几个注解使用频率最高。理解每个注解的语义和适用场景能让你在保持代码简洁的同时避免常见的使用陷阱。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号