Lombok是什么

Lombok是一个java库,它自动插入到编辑器和构建工具中,增强java的性能。不要再编写另一个getter或equals方法,使用一个注释,您的类有一个功能齐全的生成器,自动记录变量等等。简而言之,使用Lombok可以极大减轻编码工作量。

官网地址:https://projectlombok.org

GitHub地址:https://github.com/rzwitserloot/lombok

Lombok安装

IDEA Lombok插件安装

在IDEA插件中心,查找Lombok,Install之后重启IDEA。

插件安装路径:File->Settings->Plugins->Marketplace

IDEA安装Lombok

项目引入依赖

我们以Spring Boot快速搭建中spring-boot-initializr-maven为例,添加Lombok依赖

<?xml  version="1.0" encoding="UTF-8"?>   4.0.0   com.itlife   spring-boot-initializr-maven   1.0-SNAPSHOT          org.springframework.boot       spring-boot-starter-parent       2.2.6.RELEASE                     1.8       1.16.18                        org.springframework.boot           spring-boot-starter-web                                org.projectlombok           lombok           ${lombok.version}          

Lombok使用与测试

创建User实体类

package com.itlife.initializr.maven.entity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/*** @author zhongsy* @date 2020/3/27*/@Data@AllArgsConstructor@NoArgsConstructorpublic class User {   /**    * 用户Id    */   private Long id;   /**    * 用户名称    */   private String name;}
  • @Data:相当于以下四个集合* @see Getter 自动生成Getter方法
    * @see Setter 自动生成Setter
    * @see RequiredArgsConstructor
    * @see ToString 自动生成toString()方法,默认情况,按顺序(以“,”分隔)打印你的类名称以及每个字段。
    * @see EqualsAndHashCode
  • @AllArgsConstructor 自动生成一个包含所有变量的构造方法
  • @NoArgsConstructor 自动生成一个无参构造方法

创建UserController测试类

package com.itlife.initializr.maven.controller;import com.itlife.initializr.maven.entity.User;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/*** @author zhongsy* @date 2020/3/27*/@RestController@Slf4j@RequestMapping("user")public class UserController {   @GetMapping("hello")   public String hello(User user) {       log.info("收到用户信息 {}", user);       return "hi, " + user + "!";  }}
  • @Slf4j:产生一个logger field,相当于private static final Logger log = LoggerFactory.getLogger(UserController.class);

启动Spring Boot测试

  • 在浏览器输入测试地址 http://localhost:8080/user/hello?id=1&name=itLife,如果返回hi, User(id=1, name=itLife)!,表明使用成功

执行结果

修改User实体类

package com.itlife.initializr.maven.entity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;/*** @author zhongsy* @date 2020/3/27*/@Data@AllArgsConstructor@NoArgsConstructor@ToStringpublic class User {   /**    * 用户Id    */   private Long id;   /**    * 用户名称    */   private String name;   /**    * 测试重新toString与Lombok注解冲突    */   @Override   public String toString() {       return "User By Test {" +               "id=" + id +               ", name='" + name + ''' +               '}';  }}

再次启动Spring Boot测试

  • 在浏览器输入测试地址 http://localhost:8080/user/hello?id=1&name=itLife,如果返回hi, User(id=1, name=itLife)!,表明使用成功

通过测试,如果Lombok与用户所写代码有重复的话,以用户代码为准

Lombok原理解析

反编译User.class

 Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.itlife.initializr.maven.entity;import java.beans.ConstructorProperties;public class User {   private Long id;   private String name;   public Long getId() {       return this.id;  }   public String getName() {       return this.name;  }   public void setId(final Long id) {       this.id = id;  }   public void setName(final String name) {       this.name = name;  }   public boolean equals(final Object o) {       if (o == this) {           return true;      } else if (!(o instanceof User)) {           return false;      } else {           User other = (User)o;           if (!other.canEqual(this)) {               return false;          } else {               Object this$id = this.getId();               Object other$id = other.getId();               if (this$id == null) {                   if (other$id != null) {                       return false;                  }              } else if (!this$id.equals(other$id)) {                   return false;              }               Object this$name = this.getName();               Object other$name = other.getName();               if (this$name == null) {                   if (other$name != null) {                       return false;                  }              } else if (!this$name.equals(other$name)) {                   return false;              }               return true;          }      }  }   protected boolean canEqual(final Object other) {       return other instanceof User;  }   public int hashCode() {       int PRIME = true;       int result = 1;       Object $id = this.getId();       int result = result * 59 + ($id == null ? 43 : $id.hashCode());       Object $name = this.getName();       result = result * 59 + ($name == null ? 43 : $name.hashCode());       return result;  }   public String toString() {       return "User(id=" + this.getId() + ", name=" + this.getName() + ")";  }   @ConstructorProperties({"id", "name"})   public User(final Long id, final String name) {       this.id = id;       this.name = name;  }   public User() {  }}

反编译UserController.class

 Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.itlife.initializr.maven.controller;import com.itlife.initializr.maven.entity.User;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping({"user"})public class UserController {   private static final Logger log = LoggerFactory.getLogger(UserController.class);   public UserController() {  }   @GetMapping({"hello"})   public String hello(User user) {       log.info("收到用户信息 {}", user);       return "hi, " + user + "!";  }}

工作原理说明

通过反编译即可知道,Lombok在生成class文件的时候,会根据注解进行代码生成相应代码,使得我们代码更加简洁。其核心之处就是对于注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。分别是运行时解析和编译时解析两种。具体如何实现,可以自行查阅官网或者进行源码阅读。

总结

优点

  1. Lombok最大的好处就在于通过注解的形式来简化Java代码。减少大量的模板代码,一定程度提高代码可读性,可以专注于查看类的属性。

缺点

  1. 环境配置,需要集成开发工具IDEA、Eclipse之类支持
  2. 一旦项目中有人使用Lombok插件,会导致其他人也必须安装

使用建议

项目中除非是老项目,不然建议使用。新的项目,建议采用。使用Lombok可以极大减少代码量,更加专注于查看类的属性。如果对于有特殊性要求,可以在使用Lombok的同时自行写相应的方法。

springboot中使用websocket_Spring Boot中Lombok使用相关推荐

  1. springboot(三):Spring boot中Redis的使用

    转自www.ityouknow.com spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memc ...

  2. SpringBoot精通系列-Spring Boot中如何配置Https

    导语    Https作为一个比较安全的协议,现在已经越来越普及了,特别是在完成小程序或者是公众号开发的时候,https基本上都是刚需了.但是一个HTTPS的证书是比较费钱的事情,个人开发者可以通过云 ...

  3. 《spring-boot学习》-05-spring boot中redis应用

    转载http://www.cnblogs.com/ityouknow/p/5748830.html

  4. springboot事务回滚源码_Spring Boot中的事务是如何实现的

    1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...

  5. springboot 事务手动回滚_Spring Boot中的事务是如何实现的

    1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...

  6. sts引入lombok_Spring Boot中lombok的安装与使用详解

    前言 众所周知Spring Boot是非常高效的开发框架,lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用.文中详细介绍了lombok的安装与使用教程,话不多说了,来一起看 ...

  7. springboot 事务_Spring Boot中的事务是如何实现的?懂吗?

    一个SpringBoot问题就干趴下了?我却凭着这份PDF文档吊打面试官. 金三银四第一天,啃透这些SpringBoot知识点,还怕干不赢面试官? Spring全家桶笔记:Spring+Spring ...

  8. springboot @datetimeformat 标注在参数上无效_Spring Boot 中必须掌握的 45 个注解

    点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 一.SpringBoot/spring @SpringBootApplication: 包含@Configuration.@EnableA ...

  9. springboot拦截html页面元素,Spring Boot 中如何使用拦截器(十五)

    关于拦截器,大家一定都不陌生,spring boot 中是如何使用拦截器的呢?今天就举个例子,来给大家说明一下,废话不多说,开始撸代码!!! 1.创建一个新的spring boot项目,并引入相应的j ...

最新文章

  1. 10 年前被删的初恋,凌晨 1 点突然加我…
  2. python都学什么啊-Python到底有什么用?为什么那么多人都在学Python?
  3. Spring Cloud Netflix Eureka 配置参数说明
  4. VS2005+WINDDK+Driver Studio 3.2编译出第一个测试驱动程序
  5. 北京国际图书博览会暨2007 BIBF
  6. PHP面向对象(OOP)----分页类
  7. ZooKeeper(五) 使用Zookeeper有序临时节点实现分布式锁
  8. 《引爆点》读书笔记(一)
  9. win10 iot core java_Windows 10 IoT Core开发环境
  10. 【代码源 Div1 - 101】#61. 二分答案(贪心)
  11. IDEA java 显示build目录
  12. UEFI原理与编程(七):包及.dsc、.dec、.fdf文件
  13. 深度学习之CNN反向传播
  14. 用Java写小学生算术题
  15. 解决系统提示:内存不能为“read”或written的办法
  16. 支撑压力(刀哥指标)
  17. 信息机房双核与双路服务器的区别,双路和双核的区别 - 卡饭网
  18. 4种公众号文章编辑器亲测对比
  19. 【量化】股市技术分析利器之TA-Lib(二)
  20. DB2开启db2advis

热门文章

  1. 如何在SQL Server数据库中加密数据
  2. Hadoop问题:The auxService:mapreduce_shuffle does not exist
  3. 4、Kafka常见问题
  4. cocos2dx基础篇(26)——场景切换CCTransitionScene
  5. HTML P不能包含块级元素(包括自身)
  6. Exchange2010应用地址列表
  7. 实现页面内多个表格在滚动时,表头浮动的效果(是同时多个表格哟)
  8. HR怎么从面试中了解程序员的真实水平?需要面试的程序员,注意了!
  9. 9种动态可视化技巧,快速提升可视化大屏能力(附模板)
  10. 可是笑声太响了的64391111