lombok maven依赖_Spring Boot中Lombok使用

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

54fbb130dc03cd4defd7807084c2104c.png

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)!,表明使用成功
14fb7a3a3c00e8a68b802a1b91bd0da7.png

执行结果

修改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的同时自行写相应的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值