目录 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|2019-10-19 17:04|


Lombok

何为Lombok

Github: lombok | Official site

为什么要用

简化JavaBean 更为直观 省去了Setter Getter toString hashCode 构造器等方法
一定有人就会跳出来说 在IDE中几个快捷键的事情,何必这么复杂,

那他们一定是没有遇到修改的时候吧, 改个属性的名字,类型, 对应的方法你需要改吧, 但是使用lombok就不用担心了

还有很多方便的注解 例如 NonNull 加载入参上时, 会检查是否为 null 如果是, 就直接抛出NPE

为什么不要用

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

个人见解

Lombok在IDE中安装插件是为了编译和构建中能够动态的添加Getter Setter 等方法
而在Maven或者Gradle中添加是为了引入注解的包


配置

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的注解都是编译期注解, 运行期通过类是拿不到这些注解的