前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >芋道 Spring Boot 消除冗余代码 Lombok 入门

芋道 Spring Boot 消除冗余代码 Lombok 入门

作者头像
芋道源码
发布2020-04-01 15:37:12
9280
发布2020-04-01 15:37:12
举报
文章被收录于专栏:芋道源码1024芋道源码1024

摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/Lombok/ 「芋道源码」欢迎转载,保留摘要,谢谢!

  • 1. 概述
  • 2. 实现原理
  • 3. 安装 Lombok
  • 4. 搭建示例项目
  • 5. Lombok 注解一览
  • 6. @Data 注解
  • 7. @Slf4j 注解
  • 8. @NonNull 注解
  • 666. 彩蛋

1. 概述

Lombok 是一个 Java 工具,通过使用其定义的注解,自动生成常见的冗余代码,提升开发效率。

举个例子,在 Java POJO 类上,添加 @Setter@Getter 注解,自动生成 set、get 方法的代码。示例如下:

代码语言:javascript
复制
// 我们编写的 UserDO.java 代码
@Setter
@Getter
public class UserDO {

    private String username;
    private String password;

}

// 实际生成的代码(通过 UserDO.class 反编译)
public class UserDO {
    private String username;
    private String password;

    public UserDO() {
    }

    public void setUsername(final String username) {
        this.username = username;
    }

    public void setPassword(final String password) {
        this.password = password;
    }

    public String getUsername() {
        return this.username;
    }

    public String getPassword() {
        return this.password;
    }
}
  • 是不是灰常方便,嘿嘿~

2. 实现原理

Lombok 的实现原理,基于 JSR269(Pluggable Annotation Processing API) 规范,自定义编译器注解处理器,用于在 Javac 编译阶段时,扫描使用到 Lombok 定义的注解的类,进行自定义的代码生成。

想要进一步深入了解的胖友,可以阅读如下文章:

  • 《注解处理器是干嘛的》
  • 《JSR269 插件化注解API》

3. 安装 Lombok

在 IDEA 中,已经提供了 IntelliJ Lombok plugin 插件,方便我们使用 Lombok。安装方式很简单,只需要在 IDEA Plugins 功能中,搜索 Lombok 关键字即可。如下图所示:

安装完成,需要重启 IDEA 来让该插件生效。生效完成后,我们可以在 IDEA 的设置中,找到 IDEA Lombok 功能。如下图所示:

4. 搭建示例项目

可能会胖友好奇,为什么我们要把 Lombok 写在专栏呢?!确实,Lombok 不仅仅适用于 Spring Boot 项目。写在这里的原因,主要是想写一篇关于 Lombok 的文章,又不知道放在哪里才好,索性就放在这里了。

这就艿艿无处安放的青春,转眼之间就到 30 岁了~

另外,艿艿在 Spring Initializr工具中,竟然看到 Lombok 依赖的选择,这是不是意味着 Spring 也推荐我们使用它呢?如下图所示:Spring Initializr

在 Maven 项目的 pom 文件,我们只需要引入 lombok 依赖,就可以使用 Lombok 啦。代码如下:

代码语言:javascript
复制
<!-- 引入 Lombok 依赖 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

具体的示例项目搭建,就是一个普通的项目,就不重复赘述啦。本文所有示例的代码,都会放在 lab-49-lombok-demo 项目中。

5. Lombok 注解一览

Lombok 的注解非常多,我们逐个来看看。

@Getter 注解,添加在属性上,生成对应的 get 方法。

@Setter 注解,添加在属性上,生成对应的 set 方法。

@ToString 注解,添加在上,生成 toString 方法。

@EqualsAndHashCode 注解,添加在上,生成 equals 和 hashCode 方法。

@AllArgsConstructor@RequiredArgsConstructor@NoArgsConstructor 注解,添加在上,为类自动生成对应参数的构造方法。

@Data 注解,添加在上,是 5 个 Lombok 注解的组合。

  • 为所有属性,添加 @Getter@ToString@EqualsAndHashCode 注解的效果
  • 为非 final 修饰的属性,添加 @Setter 注解的效果
  • final 修改的属性,添加 @RequiredArgsConstructor 注解的效果

@Value 注解,添加在上,和 @Data 注解类似,区别在于它会把所有属性默认定义为 private final 修饰,所以不会生成 set 方法。

@CommonsLog@Flogger@Log@JBossLog、@Log4j、@Log4j2、@Slf4j、@Slf4jX 注解,添加在上,自动为类添加对应的日志支持。

@NonNull 注解,添加在方法参数类属性上,用于自动生成 null 参数检查。若确实是 null 时,抛出 NullPointerException 异常。

@Cleanup 注解,添加在方法中的局部变量上,在作用域结束时会自动调用 #close() 方法,来释放资源。例如说,使用在 Java IO 流操作的时候。

@Builder 注解,添加在上,给该类加个构造者模式 Builder 内部类。

@Synchronized 注解,添加在方法上,添加同步锁。

@SneakyThrows 注解,添加在方法上,给该方法添加 try catch 代码块。

@Accessors 注解,添加在方法属性上,并设置 chain = true,实现链式编程。

下面,我们在 Spring Boot 示例项目中,使用下 @Data@Slf4j@NonNull 这三个 Lombok 常用注解。

6. @Data 注解

@Data 注解,添加在上,是 5 个 Lombok 注解的组合。

  • 为所有属性,添加 @Getter@ToString@EqualsAndHashCode 注解的效果
  • 为非 final 修饰的属性,添加 @Setter 注解的效果
  • final 修改的属性,添加 @RequiredArgsConstructor 注解的效果

创建示例类 UserDO01,演示 @Data 注解的使用。如下图所示:

友情提示:生成的 class 类,需要手动编译下项目,才能看到对应的类,之后进行反编译。

不过要注意,如果使用 @Data 注解的类,继承成了其它父类的属性,最好额外添加 @ToString(callSuper = true)@EqualsAndHashCode(callSuper = true) 注解。

  • 因为默认情况下,@Data 注解不会处理父类的属性。所以需要我们通过 callSuper = true 属性,声明需要调用父类对应的方法。
  • 这个情况非常常见,例如说在实体类中,我们可能会声明一个抽象父类 AbstractEntity,而该类里有一个 id 编号属性。

7. @Slf4j 注解

@Slf4j 注解,添加在上,给该类创建 Slf4j Logger 静态属性。

创建示例类 UserService,演示 @Slf4 注解的使用。如下图所示:

Lombok 还提供了 @CommonsLog@Flogger@Log@JBossLog、@Log4j、@Log4j2、@Slf4jX 注解,支持持不同的 Logger 组件。因为 Spring Boot 使用 Slf4j 日志门面框架,所以绝大多数情况下,我们都是使用 @Slf4j 注解。

友情提示:对如何在 Spring Boot 是使用日志组件感兴趣的胖友,可以阅读《芋道 Spring Boot 日志集成 Logging 入门》文章。

8. @NonNull 注解

@NonNull 注解,添加在方法参数类属性上,用于自动生成 null 参数检查。若确实是 null 时,抛出 NullPointerException 异常。

创建示例类 UserService01,演示 @NonNull 注解的使用。如下图所示:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
  • 2. 实现原理
  • 3. 安装 Lombok
  • 4. 搭建示例项目
  • 5. Lombok 注解一览
  • 6. @Data 注解
  • 7. @Slf4j 注解
  • 8. @NonNull 注解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档