欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot 2.x 整合Lombok的方法示例

程序员文章站 2024-02-13 23:30:40
简介 lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。比如日常开发过程中需要生产大量的javabean文件,每个javabean都需要提供大量的ge...

简介

lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。比如日常开发过程中需要生产大量的javabean文件,每个javabean都需要提供大量的getset方法,如果字段较多且发生变动的话修改起来相对繁琐,相应的lombok可以通过注解(@getter,@setter)为我们省去手动创建gettersetter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成gettersetter方法。

即它最终能够达到的效果是:在源码中没有gettersetter方法,但是在编译生成的字节码文件中有gettersetter方法。

另外在项目开发阶段,一个class的属性是一直变化的,今天可能增加一个字段,明天可能删除一个字段。每次变化都需要修改对应的模板代码。另外,有的class的字段超级多,多到一眼看不完。如果加上模板代码,更难一眼看出来。更有甚者,由于字段太多,想要使用builder来创建。手动创建builder和字段和原来的类夹杂在一起,看起来很凌乱。lombok@builder即可解决这个问题。

官网地址:

lombok最新版本号:

官方文档:

lombok 注解介绍:

安装 lombok 插件

SpringBoot 2.x 整合Lombok的方法示例

添加注解支持

SpringBoot 2.x 整合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;
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。