Spring Boot(三) 使用Lombok
C#写的多了用习惯了众多的语法糖,再写起来Java总会有一些非常不舒服的地方。比如用惯了C#的属性在用起来Java的属性,写起来就会感觉不够优雅。如:定义一个Person类
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Describe { get; set; }
}
而同样的代码,java写起来就...
public class Person {
private String name;
private Integer age;
private String escribe;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEscribe() {
return escribe;
}
public void setEscribe(String escribe) {
this.escribe = escribe;
}
}
为了能够更优雅的编码,我们可以使用Lombok
一、Lombok介绍
Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或equals方法,同时可以自动化日志变量...官网链接
简单来说,这玩意能以简单注解的方式简化Java代码,以提高开发效率
二、 项目中引入Lombok
- 添加maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
- 创建一个
Person类,并为其加上@Data注解
package spring.boot.lombok.model;
import lombok.Data;
@Data
public class Person_Lombok {
private String name;
private Integer age;
private String describe;
}
- 安装idea插件
使用Lombok还需要插件的配合,打开idea的设置,点击Plugins,点击Browse repositories,在弹出的窗口中搜索lombok,然后安装即可。

编译时出错,可能是没有enable注解处理器。Annotation Processors > Enable annotation processing。设置完成之后程序正常运行。

- 测试运行
package spring.boot.lombok;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import spring.boot.lombok.model.Person_Lombok;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Person_LombokTests {
@Autowired
public Person_Lombok person;
@Test
public void Test() {
person.setName("王小二");
person.setAge(19);
person.setDescribe("豆蔻年华,正青春!");
Assert.assertTrue(person.getAge() == 19);
}
}
三、Lombok常用注解
@Setter注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。@Getter使用方法同上,区别在于生成的是getter方法。@ToString注解在类,添加toString方法。@EqualsAndHashCode注解在类,生成hashCode和equals方法。@NoArgsConstructor注解在类,生成无参的构造方法。@RequiredArgsConstructor注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。@AllArgsConstructor注解在类,生成包含类中所有字段的构造方法。@Data注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。@Slf4j注解在类,生成log变量,严格意义来说是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);@NonNull给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE(NullPointerException)@Cleanup自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成try-finally这样的代码来关闭流@Synchronized用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性\(lock或\)LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误@SneakyThrows自动抛受检异常,而无需显式在方法上使用throws语句
四、Lombok原理解析
我们可以反编译一下,idea为我们生成的.class文件,

可以看到虽然使用了lombok后我们没有写get,set等方法,但是是因为idea安装了lombok的插件,在编译的时候帮我们生成了这些方法。
在Lombok使用的过程中,只需要添加相应的注解,无需再为此写任何代码。核心之处就是对于注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。
- 运行时解析
运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。java.lang.reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口。
- 编译时解析
编译时解析有两种机制,分别简单描述下:
1)Annotation Processing Tool
apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:
- api都在com.sun.mirror非标准包下
- 没有集成到javac中,需要额外运行
2)Pluggable Annotation Processing API
JSR 269自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,javac执行的过程如下:

Lombok本质上就是一个实现了JSR 269 API的程序。在使用javac的过程中,它产生作用的具体流程如下:
javac对源代码进行分析,生成了一棵抽象语法树(AST)- 运行过程中调用实现了
JSR 269 API的Lombok程序 - 此时
Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树AST,然后修改该语法树AST,增加getter和setter方法定义的相应树节点 javac使用修改后的抽象语法树AST生成字节码文件,即给class增加新的节点(代码块)
五、Lombok优缺点
优点:
能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
让代码变得简洁,不用过多的去关注相应的方法
属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点:
不支持多种参数构造器的重载
虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性。
Spring Boot(三) 使用Lombok的更多相关文章
- 精选Spring Boot三十五道必知必会知识点
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家.本文精选了三十五个常见的Spring Boot知识点,祝你一臂之力! 问题一 Spr ...
- Spring Boot下的lombok安装以及使用简介
引言:lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用. 1. Lombok lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java ...
- Java精选面试题之Spring Boot 三十三问
Spring Boot Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一: Spring Boot.Spring MVC 和 ...
- spring boot(三):Spring Boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
- Spring boot(三)整合mybaties+thymeleaf实现基础crud
工程结构: 首先在pom文件中引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- spring boot(三) 集成mybatis
前言 还记得之前我们写接口也是基于SpringMVC+MyBatis环境下,项目入手就需要N个配置文件,N个步骤才能实现,不但繁琐,而且时间长了xml配置文件太多,难以维护.现在基于spring bo ...
- (转)Spring Boot(三):Spring Boot 中 Redis 的使用
http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html Spring Boot 对常用的数据库支持外,对 Nosql ...
- [转]通过Spring Boot三分钟创建Spring Web项目
来源:https://www.tianmaying.com/tutorial/project-based-on-spring-boot Spring Boot简介 接下来我们所有的Spring代码实例 ...
- Spring boot(三)在Spring boot中Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...
随机推荐
- Http协议4个新的http状态码:428、429、431、511;
1.428 Precondition Required (要求先决条件) 先决条件是客户端发送 HTTP 请求时,必须要满足的一些预设条件.一个好的例子就是 If-None-Match 头,经常用在 ...
- Codeforces 976D
题意略. 思路:构造题. 我们把全部的d[n]+1个点分作3部分来构造. 首先我们把原问题归约成构造d1.dn.和{d2 - d1,d3 - d1,.....,d[n-1] - d1}这样的问题,其中 ...
- Javaweb简介
Javaweb简介 一.什么是Javaweb? 在Sun的Java Servlet规范中,对Java Web应用作了这样定义:“Java Web应用由一组Servlet.HTML页.类.以及其它可以被 ...
- Socket I/O模型之select模型
socket网络编程中有多种常见的I/O模型: 1.blocking阻塞 2.nonblocking非阻塞 3.I/O multiplexing复用 4.signal driven 5.asynchr ...
- 【IDEA】在IDEA中使用@Slf4j报错,找不到log
题:在IDEA中使用@Slf4j报错,找不到log 解决方法:需要在IDEA中安装插件lombok 详细步骤: 1.File->Settings 2.Plugins->Browse rep ...
- JAVA实现读取图片
话不读说 直接上代码 package cn.kgc.ssm.common; import java.io.*; /** * @author * @create 2019-08-15 9:36 **/ ...
- 用java实现取1-100之间的99个不重复的随机数 然后输出没有被取出的数字
package cn.kgc.springtest2.demo1.dao; import java.util.BitSet; /** * @author * @create 2019-08-02 17 ...
- HDU - 4305 - Lightning 生成树计数 + 叉积判断三点共线
HDU - 4305 题意: 比较裸的一道生成树计数问题,构造Krichhoof矩阵,求解行列式即可.但是这道题还有一个限制,就是给定的坐标中,两点连线中不能有其他的点,否则这两点就不能连接.枚举点, ...
- SPOJ - GSS1-Can you answer these queries I 线段树维护区间连续和最大值
SPOJ - GSS1:https://vjudge.net/problem/SPOJ-GSS1 参考:http://www.cnblogs.com/shanyr/p/5710152.html?utm ...
- 2019 Multi-University Training Contest 4
A. AND Minimum Spanning Tree solved by rdc 21min -1 数组开小了,解体了一次. 题意 给一棵树,两点之间边权为 x & y,求最小生成树. 做 ...