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. Java 线程池submit和execute
  2. workerman mmo_2020了,我们为什么还在做MMO端游
  3. 解决vs.netIDE报以下文件中的行尾不一致,要将行尾标准化吗?的提示
  4. 号和管道符号(|)在不同场景下的使用方法
  5. quartz 2.2.1 jdbc 连接池参数配置
  6. 马哥linux高薪中级-DNS
  7. 68-Flutter中极光推送的使用
  8. linux内核启动文件系统,Linux启动过程中文件系统的加载
  9. 电脑重启 硬件问题引发的人品问题
  10. centos7 docker安装_教你如何在 CentOS 7 下 yum 方式安装 Docker 环境
  11. 如何删除双系统(超级详细,手把手教学)
  12. pycharm免费版下载压缩包(有需要的自取)
  13. [leetcode]剑指offer(C++版题解)
  14. SAP ABAP 关于SMARTFORMS打印中英文时候出现乱码的问题
  15. 《深度学习》学习笔记(十二)
  16. intel cpu 分类 i7、i5、i3、T系列、P系列
  17. 笔记本计算机电池没有电,笔记本主板电池没电会影响开机吗
  18. 嵌入式系统开发这六点硬件设计需要细心留意
  19. PyQt6中的第一个程序
  20. 彼岸花开,忧伤了谁的等待?诗意伤感日志

热门文章

  1. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店...
  2. MetaModelEngine:域模型定义
  3. 让VS2013支持 C# 6.0 语法
  4. ASPxGridView 结合CheckBox实现多选(在后台事件代码控制)
  5. 【iOS开发】带有 Extension Target 的 App,如何签名打包
  6. 面试题36:数组中的逆序对
  7. 我就是不敢的openeim002
  8. 有关《8zsb》的一些介绍
  9. 某少儿不宜网站图片拍摄位置分析,Python批量读取图片GPS位置!
  10. 一个程序员的逗逼瞬间(二)