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

 更新时间:2018年06月28日 14:45:57   作者:bladestone  
Spring Boot是非常高效的开发框架,lombok是一套代码模板解决方案,将极大提升开发的效率,这篇文章主要介绍了SpringBoot 2.x 整合Lombok的方法示例,感兴趣的小伙伴们可以参考一下

简介

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

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

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

官网地址:https://projectlombok.org/

lombok最新版本号:http://jcenter.bintray.com/org/projectlombok/lombok/

官方文档: https://projectlombok.org/features/all

lombok 注解介绍:https://www.jb51.net/article/151363.htm

安装 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;
  }
 }
}

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

相关文章

  • Java结合redistemplate使用分布式锁案例讲解

    Java结合redistemplate使用分布式锁案例讲解

    在Java中使用RedisTemplate结合Redis来实现分布式锁是一种常见的做法,特别适用于微服务架构或多实例部署的应用程序中,以确保数据的一致性和避免竞态条件,下面给大家分享使用Spring Boot和RedisTemplate实现分布式锁的案例,感兴趣的朋友一起看看吧
    2024-08-08
  • Jpa中Specification的求和sum不生效原理分析

    Jpa中Specification的求和sum不生效原理分析

    这篇文章主要为大家介绍了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Spring Boot常见外部配置文件方式详析

    Spring Boot常见外部配置文件方式详析

    这篇文章主要给大家介绍了关于Spring Boot常见外部配置文件方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • springboot项目中没有识别到yml文件解决办法

    springboot项目中没有识别到yml文件解决办法

    这篇文章主要给大家介绍了springboot项目中没有识别到yml文件解决办法,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • SpringCloud Feign超详细讲解

    SpringCloud Feign超详细讲解

    Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似
    2022-10-10
  • Spring Security用户定义 

    Spring Security用户定义 

    这篇文章主要介绍了Spring Security用户定义,大家都知道 Spring Security的用户定义有很多方式,其实主要有两种,基于内存的和基于数据库的,下面我给大家简单介绍一下这两种方式,需要的朋友可以参考下
    2022-02-02
  • java8 filter方法、Predicate接口的使用方式

    java8 filter方法、Predicate接口的使用方式

    这篇文章主要介绍了java8 filter方法、Predicate接口的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java C++题解leetcode904水果成篮

    Java C++题解leetcode904水果成篮

    这篇文章主要为大家介绍了Java C++题解leetcode904水果成篮示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Spring Bean初始化及销毁多种实现方式

    Spring Bean初始化及销毁多种实现方式

    这篇文章主要介绍了Spring Bean初始化及销毁多种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • MybatisPlus处理四种表与实体的映射及id自增策略分析

    MybatisPlus处理四种表与实体的映射及id自增策略分析

    在最近的工作中,碰到一个比较复杂的返回结果,发现简单映射已经解决不了这个问题了,只好去求助百度,学习mybatis表与实体的映射应该怎么写,将学习笔记结合工作碰到的问题写下本文,供自身查漏补缺,同时已被不时之需
    2022-10-10

最新评论