Lombok其实和Spring Boot关系不太大,只是这个工具太好用了,这里也整理记录一下。 Lombok是一个Java库可以与Java IDE(ItelliJ IDEA、Eclipse)和构建工具(Gradle、Maven)集成,帮助开发人员消除臃肿的Java代码,尤其是对于Java POJO类,使用Lombok后将不再需要我们去编写getter、setter、equals、hashcode等方案,Lombok通过注解实现这一目标。

Lombok的安装和配置

Lombok是一个Java库需要与Java IDE(ItelliJ IDEA、Eclipse)和构建工具(Gradle、Maven)集成。 Lombok的安装和配置实际上就是与IDE和构建工具的集成过程。

与Gradle集成

先来看与构建工具的集成,这里以gradle为例:

 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
plugins {
	id 'org.springframework.boot' version '2.1.3.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'spring-boot-guides'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

annotationProcessor 'org.projectlombok:lombok'是为Gradle引入lombok编译时注解处理器的依赖,Gradle在编译时会使用注解处理器。这块具体的代码可以查看lombok.launch包中代码如lombok.launch.AnnotationProcessorHider.AnnotationProcessor

compileOnly 'org.projectlombok:lombok'是为开发人员引入编译依赖,引入这个依赖后,在编写代码时就可以使用lombok的注解了,例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package springbootguides.lombokdemo.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
}

@Data @Builder...等这些注解只有在编译时才会用到,所以这里使用compileOnly更为准确一些。

编写下面的测试代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package springbootguides.lombokdemo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springbootguides.lombokdemo.entity.User;

@SpringBootApplication
public class LombokDemoApplication implements CommandLineRunner {

	public static void main(String[] args) {
		SpringApplication.run(LombakDemoApplication.class, args);
	}

	@Override
	public void run(String... args) throws Exception {
		User user = new User();
		user.setId(1);
		user.setName("Jane");
		User user2 = User.builder().id(2).name("Frank").build();
		System.out.println(user.toString());
		System.out.println(user2.toString());
	}
}

运行gradle compileJava,可以看到在User类中并没有编写getter、setter、builder等方法,测试类中使用了它们且可以编译通过。

与Intellij IDEA集成

在lombok与gradle集成之后,通过修改Idea的配置: Settings -> Build,Execution,Deployment -> Build Tools -> Gradle -> Runner: 勾选Delegate IDE build/run actions to gradle,并选择Run tests using Gradle Test Runner。 此时运行IDEA的Build或Run功能,都会委托给gradle,对于使用了lombok的项目也是可以编译和运行的。

但美中不足的地方是lombok,此时项目中lombok为我们生成的地方在IDEA中显示有红色,这是因为IDEA还不认识,只是Gradle认识它们。 因此还需要配置lombok与IDEA集成,只需要给IDEA安装lombok-plugin即可。

注:Delegate IDE build/run actions to gradle不是必须的,但是对于项目构建中使用gradle做了深度的定制的还是有必要的。例如我们的grpc java服务项目使用了protobuf-gradle-plugin将protobuf IDL文件生成java代码,此时需要将IDEA的构建和运行委托给gradle,具体查看https://github.com/google/protobuf-gradle-plugin

Lombok的使用

关于lombok的使用快速读一遍它的官方文档即可:

另外lombok官网上还提供了一个4分钟的演示视频看一遍差不多就够了。

Lombok的原理

Lombok主要是将编译期定义的注解,利用JSR269(Pluggable Annotation Processing API)的编译器注解处理器,在javac编译阶段对这些注解进行预处理后生成可用的Class文件。

参考