springboot中使用websocket_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
![](/assets/blank.gif)
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)!,表明使用成功
![](/assets/blank.gif)
执行结果
修改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引入了注解的同时,也提供了两种解析方式。分别是运行时解析和编译时解析两种。具体如何实现,可以自行查阅官网或者进行源码阅读。
总结
优点
- Lombok最大的好处就在于通过注解的形式来简化Java代码。减少大量的模板代码,一定程度提高代码可读性,可以专注于查看类的属性。
缺点
- 环境配置,需要集成开发工具IDEA、Eclipse之类支持
- 一旦项目中有人使用Lombok插件,会导致其他人也必须安装
使用建议
项目中除非是老项目,不然建议使用。新的项目,建议采用。使用Lombok可以极大减少代码量,更加专注于查看类的属性。如果对于有特殊性要求,可以在使用Lombok的同时自行写相应的方法。
springboot中使用websocket_Spring Boot中Lombok使用相关推荐
- springboot(三):Spring boot中Redis的使用
转自www.ityouknow.com spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memc ...
- SpringBoot精通系列-Spring Boot中如何配置Https
导语 Https作为一个比较安全的协议,现在已经越来越普及了,特别是在完成小程序或者是公众号开发的时候,https基本上都是刚需了.但是一个HTTPS的证书是比较费钱的事情,个人开发者可以通过云 ...
- 《spring-boot学习》-05-spring boot中redis应用
转载http://www.cnblogs.com/ityouknow/p/5748830.html
- springboot事务回滚源码_Spring Boot中的事务是如何实现的
1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...
- springboot 事务手动回滚_Spring Boot中的事务是如何实现的
1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...
- sts引入lombok_Spring Boot中lombok的安装与使用详解
前言 众所周知Spring Boot是非常高效的开发框架,lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用.文中详细介绍了lombok的安装与使用教程,话不多说了,来一起看 ...
- springboot 事务_Spring Boot中的事务是如何实现的?懂吗?
一个SpringBoot问题就干趴下了?我却凭着这份PDF文档吊打面试官. 金三银四第一天,啃透这些SpringBoot知识点,还怕干不赢面试官? Spring全家桶笔记:Spring+Spring ...
- springboot @datetimeformat 标注在参数上无效_Spring Boot 中必须掌握的 45 个注解
点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 一.SpringBoot/spring @SpringBootApplication: 包含@Configuration.@EnableA ...
- springboot拦截html页面元素,Spring Boot 中如何使用拦截器(十五)
关于拦截器,大家一定都不陌生,spring boot 中是如何使用拦截器的呢?今天就举个例子,来给大家说明一下,废话不多说,开始撸代码!!! 1.创建一个新的spring boot项目,并引入相应的j ...
最新文章
- 10 年前被删的初恋,凌晨 1 点突然加我…
- python都学什么啊-Python到底有什么用?为什么那么多人都在学Python?
- Spring Cloud Netflix Eureka 配置参数说明
- VS2005+WINDDK+Driver Studio 3.2编译出第一个测试驱动程序
- 北京国际图书博览会暨2007 BIBF
- PHP面向对象(OOP)----分页类
- ZooKeeper(五) 使用Zookeeper有序临时节点实现分布式锁
- 《引爆点》读书笔记(一)
- win10 iot core java_Windows 10 IoT Core开发环境
- 【代码源 Div1 - 101】#61. 二分答案(贪心)
- IDEA java 显示build目录
- UEFI原理与编程(七):包及.dsc、.dec、.fdf文件
- 深度学习之CNN反向传播
- 用Java写小学生算术题
- 解决系统提示:内存不能为“read”或written的办法
- 支撑压力(刀哥指标)
- 信息机房双核与双路服务器的区别,双路和双核的区别 - 卡饭网
- 4种公众号文章编辑器亲测对比
- 【量化】股市技术分析利器之TA-Lib(二)
- DB2开启db2advis
热门文章
- 如何在SQL Server数据库中加密数据
- Hadoop问题:The auxService:mapreduce_shuffle does not exist
- 4、Kafka常见问题
- cocos2dx基础篇(26)——场景切换CCTransitionScene
- HTML P不能包含块级元素(包括自身)
- Exchange2010应用地址列表
- 实现页面内多个表格在滚动时,表头浮动的效果(是同时多个表格哟)
- HR怎么从面试中了解程序员的真实水平?需要面试的程序员,注意了!
- 9种动态可视化技巧,快速提升可视化大屏能力(附模板)
- 可是笑声太响了的64391111