点击上方“芋道源码”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
原创 | Java 2020 超神之路,很肝~
中文详细注释的开源项目
RPC 框架 Dubbo 源码解析
网络应用框架 Netty 源码解析
消息中间件 RocketMQ 源码解析
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
作业调度中间件 Elastic-Job 源码解析
分布式事务中间件 TCC-Transaction 源码解析
Eureka 和 Hystrix 源码解析
Java 并发源码
摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/Lombok/ 「芋道源码」欢迎转载,保留摘要,谢谢!
1. 概述
2. 实现原理
3. 安装 Lombok
4. 搭建示例项目
5. Lombok 注解一览
6. @Data 注解
7. @Slf4j 注解
8. @NonNull 注解
666. 彩蛋
Lombok 是一个 Java 工具,通过使用其定义的注解,自动生成常见的冗余代码,提升开发效率。
举个例子,在 Java POJO 类上,添加 @Setter
和 @Getter
注解,自动生成 set、get 方法的代码。示例如下:
// 我们编写的 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;
}
}
是不是灰常方便,嘿嘿~
Lombok 的实现原理,基于 JSR269(Pluggable Annotation Processing API) 规范,自定义编译器注解处理器,用于在 Javac 编译阶段时,扫描使用到 Lombok 定义的注解的类,进行自定义的代码生成。
想要进一步深入了解的胖友,可以阅读如下文章:
《注解处理器是干嘛的》
《JSR269 插件化注解API》
在 IDEA 中,已经提供了 IntelliJ Lombok plugin 插件,方便我们使用 Lombok。安装方式很简单,只需要在 IDEA Plugins 功能中,搜索 Lombok 关键字即可。如下图所示:
安装完成,需要重启 IDEA 来让该插件生效。生效完成后,我们可以在 IDEA 的设置中,找到 IDEA Lombok 功能。如下图所示:
可能会胖友好奇,为什么我们要把 Lombok 写在专栏呢?!确实,Lombok 不仅仅适用于 Spring Boot 项目。写在这里的原因,主要是想写一篇关于 Lombok 的文章,又不知道放在哪里才好,索性就放在这里了。
这就艿艿无处安放的青春,转眼之间就到 30 岁了~
另外,艿艿在 Spring Initializr工具中,竟然看到 Lombok 依赖的选择,这是不是意味着 Spring 也推荐我们使用它呢?如下图所示:Spring Initializr
在 Maven 项目的 pom
文件,我们只需要引入 lombok
依赖,就可以使用 Lombok 啦。代码如下:
org.projectlombok
lombok
true
具体的示例项目搭建,就是一个普通的项目,就不重复赘述啦。本文所有示例的代码,都会放在 lab-49-lombok-demo 项目中。
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 常用注解。
@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
编号属性。
@Slf4j
注解,添加在类上,给该类创建 Slf4j Logger 静态属性。
创建示例类 UserService,演示 @Slf4
注解的使用。如下图所示:
Lombok 还提供了 @CommonsLog
、@Flogger
、@Log
、@JBossLog
、@Log4j、@Log4j2、@Slf4jX 注解,支持持不同的 Logger 组件。因为 Spring Boot 使用 Slf4j 日志门面框架,所以绝大多数情况下,我们都是使用 @Slf4j
注解。
友情提示:对如何在 Spring Boot 是使用日志组件感兴趣的胖友,可以阅读《芋道 Spring Boot 日志集成 Logging 入门》文章。
@NonNull
注解,添加在方法参数、类属性上,用于自动生成 null
参数检查。若确实是 null
时,抛出 NullPointerException 异常。
创建示例类 UserService01,演示 @NonNull
注解的使用。如下图所示:
至此,我们已经完成了 Lombok 的学习。如果胖友在项目中还没使用,可以考虑下哟。嘿嘿,看了下 Lombok 竟然在 Github 上,被 37W+ 开源项目所使用。如下图所示:
更多 Lombok 的使用示例,胖友可以继续阅读如下两篇文章:
《Lombok 安装及Spring Boot 集成 Lombok》
《Lombok 官方文档 —— 功能列表》
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。