【java】[Lombok] ---- Spring Boot 3 整合 Lombok:从入门到精通实战应用详细教程

【java】[Lombok] ---- Spring Boot 3 整合 Lombok:从入门到精通实战应用详细教程

Spring Boot 3整合Lombok:从入门到精通

Lombok是一个Java开发工具库,它通过注解方式减少模板代码,提高开发效率。本文将详细介绍如何在Spring Boot 3项目中整合Lombok,并全面讲解其常用注解和实战技巧。

一、Lombok简介

Lombok通过注解处理器在编译时自动生成Java类的模板代码,如getter、setter、构造函数、toString等方法,让开发者专注于业务逻辑而非模板代码。

优势:

  • 减少代码量,提高开发效率
  • 避免手动编写模板代码时可能出现的错误
  • 使代码更简洁,提高可读性
  • 减少维护成本

二、Spring Boot 3整合Lombok

2.1 添加依赖

在Spring Boot 3项目的pom.xml中添加Lombok依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><optional>true</optional></dependency>

对于Gradle项目,在build.gradle中添加:

implementation 'org.projectlombok:lombok:1.18.24' annotationProcessor 'org.projectlombok:lombok:1.18.24'

2.2 IDE配置

为了让IDE正确识别Lombok注解,需要安装Lombok插件:

  • IntelliJ IDEA:File > Settings > Plugins,搜索"Lombok"并安装
  • Eclipse:Help > Eclipse Marketplace,搜索"Lombok"并安装

安装完成后,需要启用注解处理器:

  • IntelliJ IDEA:File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors,勾选"Enable annotation processing"

三、Lombok常用注解详解

3.1 @Getter和@Setter

为类的字段生成getter和setter方法。

importlombok.Getter;importlombok.Setter;@Getter@SetterpublicclassUser{privateLong id;privateString username;privateString email;// Lombok会自动生成以下方法:// public Long getId() { return id; }// public void setId(Long id) { this.id = id; }// ... 其他字段的getter和setter}

也可以在单个字段上使用,只为该字段生成getter/setter:

publicclassUser{@Getter@SetterprivateLong id;privateString username;// 不会生成getter/setter}

3.2 @ToString

生成toString()方法,包含类名和所有非静态字段。

importlombok.ToString;@ToString(exclude ="password")// 排除password字段publicclassUser{privateLong id;privateString username;privateString email;privateString password;// 生成的toString类似:// User(id=1, username=john, [email protected])}

常用属性:

  • exclude:排除指定字段
  • of:只包含指定字段
  • callSuper:是否包含父类的toString结果

3.3 构造函数相关注解

Lombok提供了多个构造函数相关的注解:

importlombok.NoArgsConstructor;importlombok.AllArgsConstructor;importlombok.RequiredArgsConstructor;importlombok.NonNull;@NoArgsConstructor// 无参构造函数@AllArgsConstructor// 全参构造函数@RequiredArgsConstructor// 为final和@NonNull字段生成构造函数publicclassUser{privateLong id;@NonNullprivateString username;privatefinalString email;// final字段privateString password;// 生成的RequiredArgsConstructor类似:// public User(String username, String email) {// this.username = username;// this.email = email;// }}

3.4 @Data

@Data是一个组合注解,包含了@Getter、@Setter、@ToString、@EqualsAndHashCode和@RequiredArgsConstructor的功能。

importlombok.Data;importlombok.NonNull;@DatapublicclassUser{privateLong id;@NonNullprivateString username;privateString email;privateString password;// 自动生成:// 所有字段的getter和setter// toString()// equals()和hashCode()// 包含@NonNull字段的构造函数}

3.5 @Builder

实现建造者模式,方便创建对象。

importlombok.Builder;importlombok.Data;@Data@BuilderpublicclassUser{privateLong id;privateString username;privateString email;privateString password;}// 使用示例classUserExample{publicstaticvoidmain(String[] args){User user =User.builder().id(1L).username("john_doe").email("[email protected]").password("secure123").build();}}

3.6 @Slf4j

为类生成日志对象,无需手动创建。

importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Service;@Service@Slf4jpublicclassUserService{publicvoidcreateUser(User user){ log.info("Creating user: {}", user.getUsername());try{// 业务逻辑 log.debug("User created successfully: {}", user.getId());}catch(Exception e){ log.error("Error creating user", e);throw e;}}// Lombok自动生成:// private static final org.slf4j.Logger log = // org.slf4j.LoggerFactory.getLogger(UserService.class);}

类似的日志注解还有@Log、@Log4j、@Log4j2等,根据项目使用的日志框架选择。

3.7 @NonNull

用于字段或方法参数,自动生成非空检查。

importlombok.NonNull;publicclassUser{privateLong id;@NonNullprivateString username;publicvoidsetUsername(@NonNullString username){this.username = username;}// 生成的代码包含:// if (username == null) {// throw new NullPointerException("username is marked non-null but is null");// }}

3.8 @SneakyThrows

自动捕获并抛出异常,无需显式编写try-catch块。

importlombok.SneakyThrows;importjava.io.File;importjava.io.FileReader;publicclassFileUtil{@SneakyThrows// 无需显式声明throws IOExceptionpublicstaticStringreadFile(String path){File file =newFile(path);try(FileReader reader =newFileReader(file)){char[] buffer =newchar[(int) file.length()]; reader.read(buffer);returnnewString(buffer);}}}

四、Spring Boot实战中的Lombok应用

4.1 实体类(Entity)

importjakarta.persistence.*;importlombok.Data;importlombok.NoArgsConstructor;importlombok.AllArgsConstructor;importlombok.Builder;@Entity@Table(name ="users")@Data@NoArgsConstructor@AllArgsConstructor@BuilderpublicclassUser{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;@Column(nullable =false, unique =true)privateString username;@Column(nullable =false)privateString password;@Column(nullable =false, unique =true)privateString email;privateString fullName;privateboolean active =true;}

4.2 DTO(数据传输对象)

importlombok.Data;importlombok.Builder;importjava.time.LocalDateTime;@Data@BuilderpublicclassUserDTO{privateLong id;privateString username;privateString email;privateString fullName;privateLocalDateTime createdAt;}

4.3 服务层(Service)

importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;@Service@RequiredArgsConstructor// 注入final字段的构造函数@Slf4jpublicclassUserService{privatefinalUserRepository userRepository;privatefinalPasswordEncoder passwordEncoder;@TransactionalpublicUserDTOcreateUser(UserCreateRequest request){ log.info("Creating new user: {}", request.getUsername());// 检查用户名是否已存在if(userRepository.existsByUsername(request.getUsername())){ log.warn("Username already exists: {}", request.getUsername());thrownewUsernameAlreadyExistsException("Username already exists");}// 构建用户实体User user =User.builder().username(request.getUsername()).password(passwordEncoder.encode(request.getPassword())).email(request.getEmail()).fullName(request.getFullName()).build();// 保存用户User savedUser = userRepository.save(user); log.info("User created with id: {}", savedUser.getId());// 转换为DTO并返回returnUserDTO.builder().id(savedUser.getId()).username(savedUser.getUsername()).email(savedUser.getEmail()).fullName(savedUser.getFullName()).createdAt(LocalDateTime.now()).build();}}

五、Lombok高级特性

5.1 自定义Lombok配置

在项目根目录创建lombok.config文件,可以全局配置Lombok的行为:

# 配置所有@ToString都包含父类信息 lombok.toString.callSuper=call # 配置所有@EqualsAndHashCode都包含父类信息 lombok.equalsAndHashCode.callSuper=call # 禁止使用@Data注解(团队规范) lombok.data.flagUsage=error # 设置日志字段名称 lombok.log.fieldName=logger 

5.2 链式调用

使用@Accessors(chain = true)实现setter方法的链式调用:

importlombok.Data;importlombok.experimental.Accessors;@Data@Accessors(chain =true)publicclassProduct{privateLong id;privateString name;privatedouble price;}// 使用示例classProductExample{publicstaticvoidmain(String[] args){Product product =newProduct().setId(1L).setName("Laptop").setPrice(999.99);}}

5.3 静态构造方法

使用@NoArgsConstructor(access = AccessLevel.PRIVATE)和静态方法创建实例:

importlombok.Data;importlombok.NoArgsConstructor;importjava.time.LocalDateTime;@Data@NoArgsConstructor(access =lombok.AccessLevel.PRIVATE)publicclassApiResponse<T>{privateint status;privateString message;privateT data;privateLocalDateTime timestamp;publicstatic<T>ApiResponse<T>success(T data){ApiResponse<T> response =newApiResponse<>(); response.setStatus(200); response.setMessage("Success"); response.setData(data); response.setTimestamp(LocalDateTime.now());return response;}publicstatic<T>ApiResponse<T>error(int status,String message){ApiResponse<T> response =newApiResponse<>(); response.setStatus(status); response.setMessage(message); response.setTimestamp(LocalDateTime.now());return response;}}

六、注意事项和最佳实践

  1. 团队共识:确保团队所有成员都熟悉Lombok,避免因不熟悉注解功能导致的问题。
  2. 谨慎使用@Data:@Data包含@EqualsAndHashCode,对于有继承关系的类可能导致equals方法不符合预期。
  3. 与Jackson等序列化工具配合:确保Lombok生成的方法能被序列化工具正确识别。
  4. 版本兼容性:确保Lombok版本与Spring Boot版本兼容,特别是在升级Spring Boot时。
  5. 避免过度使用:不是所有类都需要Lombok注解,简单的类手动编写可能更清晰。
  6. 注意反序列化问题:某些框架(如Jackson)在反序列化时需要无参构造函数,确保使用@NoArgsConstructor。
  7. IDE支持:确保所有开发者的IDE都正确安装并配置了Lombok插件。

七、总结

Lombok是Spring Boot开发中的得力助手,能够显著减少模板代码,提高开发效率。通过本文介绍的注解和实战技巧,你可以从入门到精通Lombok的使用。

关键是要理解每个注解的作用和适用场景,在团队中建立使用规范,并注意潜在的陷阱。合理使用Lombok可以让你的代码更加简洁、易读和易于维护。

随着你对Lombok的深入使用,还可以探索其更多高级特性和自定义配置,进一步提升开发体验。

Read more

华为OD机试双机位C卷-统计员工影响力分数(C/C++/Py/Java/JS/GO)

华为OD机试双机位C卷-统计员工影响力分数(C/C++/Py/Java/JS/GO)

统计员工影响力分数 2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 200分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 假设你是大型科技公司的数据分析师,负责分析公司内部员工的社交网络。你需要编写一个函数来计算每个员工的影响力分数。影响力分数定义为该员工直接和间接影响的员工数量。 输入描述 n:员工总数。 employess:一个二维列表,表示员工的社交网络关系。例如employees[i]是一个包含员工i直接影响的员工ID的列表。 备注 employees列表中,* 表示没有直接影响到的员工;员工总数小于20;自身不算分数。 输出描述 influenceScores,一个整数数组,表示每个员工的影响力分数。 用例1 输入 4 1 2 3 * <

By Ne0inhk
Log4j 详解:Java经典日志框架

Log4j 详解:Java经典日志框架

在 Java 开发中,日志是排查问题、监控程序运行状态的核心手段。相比于System.out.println,专业的日志框架能提供更灵活的配置、更优的性能和更丰富的功能。本文将全面讲解 Log4j 的核心概念、配置方式及实战技巧,帮助你快速掌握并落地到项目中。 一、日志框架概述 1.1 什么是日志 日志是程序运行过程中产生的事件记录,典型场景包括: * 业务流程节点:如 “用户 ID=123 提交订单,订单号 = 456”; * 异常详情:捕获异常时记录完整堆栈信息(替代e.printStackTrace()); * 关键参数 / 结果:如接口入参、返回值; * 系统状态:如 JVM 内存使用、数据库连接池状态。 1.2 为什么要打印日志? 调试器断点仅适用于开发阶段,且可能因断点导致多线程问题 “隐藏”;而日志能持久化记录程序运行轨迹,

By Ne0inhk
Java 大视界 -- Java 大数据在智能教育在线实验室设备管理与实验资源优化中的应用(261)

Java 大视界 -- Java 大数据在智能教育在线实验室设备管理与实验资源优化中的应用(261)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 全网(微信公众号/ZEEKLOG/抖音/华为/支付宝/微博) :青云交 一、本博客的精华专栏: 1. 大数据新视界专栏系列:聚焦大数据,展技术应用,推动进步拓展新视野。 2. Java 大视界专栏系列(NEW):聚焦 Java 编程,涵盖基础到高级,展示多领域应用,含性能优化等,助您拓宽视野提能力 。 3. Java 大厂面试专栏系列:提供大厂面试的相关技巧和经验,助力求职。 4. Python 魅力之旅:探索数据与智能的奥秘专栏系列:走进

By Ne0inhk
飞算JavaAI:重新定义研发效能,让代码生成如丝般顺滑

飞算JavaAI:重新定义研发效能,让代码生成如丝般顺滑

飞算JavaAI:重新定义研发效能,让代码生成如丝般顺滑 1. 摘要 在软件开发的浩瀚星空中,每一位程序员都渴望找到提升研发效能的金钥匙。本文将深入探讨飞算JavaAI这一革命性的智能编程助手,它不仅仅是一个代码生成工具,更是开发者效率提升的全新解决方案。通过深入剖析其本地化智能、精准的上下文理解和可控的代码生成机制,我们将揭示如何彻底改变传统软件研发模式。从根本上解决重复劳动、效率低下的痛点,飞算JavaAI正在重新定义Java开发的生产力边界,为开发者带来前所未有的编程体验。 2. 研发的痛与梦:智能编程助手的诞生背景 2.1. 传统研发的困境 每一位程序员都曾经历过这些令人沮丧的时刻: * 重复编写千篇一律的样板代码 * 在复杂项目中迷失代码架构 * 浪费大量时间在低价值的技术细节上 "程序员的价值不应该被重复性劳动消耗,而是应该专注于创新和解决实际问题。" —— 硅谷资深工程师 2.2. 智能编程的理想与现实 传统代码生成工具的局限性: 维度 传统工具 飞算JavaAI 上下文理解 有限 深度智能 本地化处理 依赖云端

By Ne0inhk