目录 start

  1. Lombok
    1. 何为Lombok
    2. 为什么要用
    3. 为什么不要用
    4. 个人见解
  2. 配置
    1. Maven
      1. 普通Java项目
      2. Groovy和Java项目使用Lombok
    2. Gradle
  3. 使用
    1. 注解使用
      1. POJO常用
      2. 日志相关
      3. 异常相关
  4. 实现原理

目录 end|2020-04-27 23:42|


Lombok

何为Lombok

Github: lombok | Official site

为什么要用

简化 JavaBean 省去了 Setter Getter toString hashCode 等方法,提供 生成构造器 Builder Log 等功能

为什么不要用

破坏了阅读代码的完整性, 当使用了构造器这样的注解, 如果想通过看构造器的引用方来找到调用方, 这时候是没有办法的 只能通过查看类的所有引用方再一个个找
常见IDE都没有原生支持, 必须要安装对应的插件才能正常编译运行项目

个人见解

Lombok在IDE中安装插件是为了编译和构建中能够动态的添加Getter Setter 等方法 而在Maven或者Gradle中添加是为了引入注解的包
取决于团队风格,用不用都不是大问题 Java14 新出的 record 类型也能满足lombok部分需求


配置

Maven

Official Guide

普通Java项目

1
2
3
4
5
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.10</version>
    </dependency>

Groovy和Java项目使用Lombok

配置编译插件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!--lombok-->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
    <target>1.8</target>
    <source>1.8</source>
    <encoding>UTF-8</encoding>
    <compilerId>groovy-eclipse-compiler</compilerId>
    <verbose>true</verbose>
    <fork>true</fork>
    <compilerArguments>
    <javaAgentClass>lombok.launch.Agent</javaAgentClass>
    </compilerArguments>
</configuration>
<dependencies>
    <dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-eclipse-compiler</artifactId>
    <version>2.9.3-01</version>
    </dependency>
    <dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-eclipse-batch</artifactId>
    <version>2.5.0-01</version>
    </dependency>
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.10</version>
    </dependency>
</dependencies>
</plugin>

添加依赖

1
2
3
4
5
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.10</version>
    </dependency>

Gradle

使用Lombok的正确方式

gradle lombok plugin
Official Guide

1
2
3
4
  annotationProcessor 'org.projectlombok:lombok:1.18.2'
  compileOnly 'org.projectlombok:lombok:1.18.2'
  testAnnotationProcessor 'org.projectlombok:lombok:1.18.2'
  testCompileOnly 'org.projectlombok:lombok:1.18.2'

使用

注解使用

POJO常用

注解 范围 功能
@Data Getter Setter RequiredArgsConstructor ToString EqualsAndHashCode 的集合
@Setter 为属性提供 setter 方法
@Getter 为属性提供 getter 方法
@NoArgsConstructor 为类提供一个无参的构造方法
@AllArgsConstructor 为类提供一个全参的构造方法
@Builder 类 方法 构造器 生成 构造器模式 模板代码
@Delegate 属性,方法 将属性的方法委派到当前对象上 常用于嵌套的POJO

日志相关

Official log

  • @CommonsLog
    • private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
  • @Flogger
    • private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();
  • @JBossLog
    • private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
  • @Log
    • private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
  • @Log4j
    • private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
  • @Log4j2
    • private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
  • @Slf4j
    • private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
  • @XSlf4j
  • private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

异常相关

  1. @SneakyThrows

实现原理

参考: Lombok原理分析与功能实现

Lombok的注解都是编译期源码注解(RetentionPolicy.SOURCE), 运行期是拿不到这些注解的