SpringBoot 2.x 整合Lombok的方法示例
简介
lombok
是一个编译级别的插件,它可以在项目编译的时候生成一些代码。比如日常开发过程中需要生产大量的javabean
文件,每个javabean
都需要提供大量的get
和set
方法,如果字段较多且发生变动的话修改起来相对繁琐,相应的lombok
可以通过注解(@getter,@setter)
为我们省去手动创建getter
和setter
方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter
和setter
方法。
即它最终能够达到的效果是:在源码中没有getter
和setter
方法,但是在编译生成的字节码文件中有getter
和setter
方法。
另外在项目开发阶段,一个class
的属性是一直变化的,今天可能增加一个字段,明天可能删除一个字段。每次变化都需要修改对应的模板代码。另外,有的class
的字段超级多,多到一眼看不完。如果加上模板代码,更难一眼看出来。更有甚者,由于字段太多,想要使用builder
来创建。手动创建builder
和字段和原来的类夹杂在一起,看起来很凌乱。lombok
的@builder
即可解决这个问题。
官网地址:
lombok最新版本号:
官方文档:
lombok 注解介绍:
安装 lombok 插件
添加注解支持
添加依赖
buildscript { ext { springbootversion = '2.0.2.release' } repositories { mavencentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springbootversion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'com.yanjun' version = '0.0.1-snapshot' sourcecompatibility = 1.8 repositories { mavencentral() } dependencies { compile('org.springframework.boot:spring-boot-starter', 'org.springframework.boot:spring-boot-starter-web', ) //添加lombok依赖 compile 'org.projectlombok:lombok:1.18.0' }
常用注解
- @data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canequal、hashcode、tostring 方法
- @setter :注解在属性上;为属性提供 setting 方法
- @setter :注解在属性上;为属性提供 getting 方法
- @log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
- @noargsconstructor :注解在类上;为类提供一个无参的构造方法
- @allargsconstructor :注解在类上;为类提供一个全参的构造方法
- @cleanup : 可以关闭流
- @builder : 被注解的类加个构造者模式
- @synchronized : 加个同步锁
- @sneakythrows : 等同于try/catch 捕获异常
- @nonnull : 如果给参数加个这个注解 参数为null会抛出空指针异常
- @value : 注解和@data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
@nonnull 判空处理
package com.yanjun.mybatis.bean; import lombok.data; import lombok.noargsconstructor; import lombok.nonnull; @data @noargsconstructor public class user { public integer age; @nonnull public string name; }
相当于
package com.yanjun.mybatis.bean; import lombok.nonnull; public class user { public integer age; @nonnull public string name; public integer getage() { return this.age; } @nonnull public string getname() { return this.name; } public void setage(integer age) { this.age = age; } public void setname(@nonnull string name) { if (name == null) { throw new nullpointerexception("name is marked @nonnull but is null"); } else { this.name = name; } } }
测试
user user = new user(); user.setname(null);
效果
exception in thread "main" java.lang.nullpointerexception: name is marked @nonnull but is null
at com.yanjun.mybatis.bean.user.setname(user.java:7)
at com.yanjun.mybatis.lombokapplication.main(lombokapplication.java:15)
@data 提供 get、set 方法
package com.yanjun.mybatis.bean; import lombok.data; @data //自动生成 get、set 方法 public class user { integer id; string name; integer age; public static void main(string[] args) { //测试方法 user user = new user(); user.setname("zhaoyanjun"); user.setage(20); user.setid(1); } }
@slf4j 日志打印
package com.yanjun.mybatis.bean; import lombok.data; import lombok.extern.slf4j.slf4j; @data //自动生成 get、set 方法 @slf4j //日志打印 public class user { integer id; string name; integer age; public static void main(string[] args) { user user = new user(); user.setname("zhaoyanjun"); user.setage(20); user.setid(1); log.info("日志" + user.tostring()); } }
@allargsconstructor 全参数构造函数
package com.yanjun.mybatis.bean; import lombok.allargsconstructor; import lombok.data; import lombok.extern.slf4j.slf4j; @data //自动生成 get、set 方法 @allargsconstructor //自动生成全参数构造函数 @slf4j //日志打印 public class user { integer id; string name; integer age; public static void main(string[] args) { user user = new user(1, "zhaoyanjun", 20); log.info("日志" + user.tostring()); } }
@tostring 自动生成tostring方法
package com.yanjun.mybatis.bean; import lombok.allargsconstructor; import lombok.data; import lombok.tostring; import lombok.extern.slf4j.slf4j; @data //自动生成 get、set 方法 @allargsconstructor //自动生成全参数构造函数 @slf4j //日志打印 @tostring(of = {"id","age"}) //tostring() 方法里面只打印 id ,name 字段 public class user { integer id; string name; integer age; public static void main(string[] args) { user user = new user(1, "zhaoyanjun", 20); log.info("日志" + user.tostring()); } }
tostring() 方法排除字段
//排除字段 @tostring(exclude = {"name"}) //tostring() 方法中,name 字段不参与打印
@value 用于注解final类
@value
注解和@data
类似,区别在于它会把所有成员变量默认定义为 private final
修饰,并且不会生成set
方法。
package com.yanjun.mybatis.bean; import lombok.value; @value public class user { integer id = 1; string name = "zhaoyanjun"; integer age = 3 ; }
编译后的代码
public final class user { private final integer id = 1; private final string name = "zhaoyanjun"; private final integer age = 3; public user() { } public integer getid() { return this.id; } public string getname() { this.getclass(); return "zhaoyanjun"; } public integer getage() { return this.age; } //省略部分代码 ...... }
@builder : 被注解的类加个构造者模式
import lombok.builder; @builder public class user { public integer id; public string name; public integer age; }
相当于以下代码
package com.yanjun.mybatis.bean; public class user { public integer id; public string name; public integer age; user(integer id, string name, integer age) { this.id = id; this.name = name; this.age = age; } public static user.userbuilder builder() { return new user.userbuilder(); } public static class userbuilder { private integer id; private string name; private integer age; userbuilder() { } public user.userbuilder id(integer id) { this.id = id; return this; } public user.userbuilder name(string name) { this.name = name; return this; } public user.userbuilder age(integer age) { this.age = age; return this; } public user build() { return new user(this.id, this.name, this.age); } public string tostring() { return "user.userbuilder(id=" + this.id + ", name=" + this.name + ", age=" + this.age + ")"; } } }
使用
userbuilder userbuilder = user.builder(); user user = userbuilder .age(10) .id(1) .name("yanjun") .build(); system.out.println(": " + userbuilder.tostring());
@synchronized : 加个同步锁
package com.yanjun.mybatis.bean; import lombok.synchronized; public class user { public integer age; public string name; //普通方法,相当于对象锁 @synchronized int run1() { return 1; } //静态方法,相当于类锁 @synchronized static int run2() { return 2; } }
代码的效果相当于
public class user { private final object $lock = new object[0]; private static final object $lock = new object[0]; public integer age; public string name; public user() { } int run1() { object var1 = this.$lock; synchronized(this.$lock) { return 1; } } static int run2() { object var0 = $lock; synchronized($lock) { return 2; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。