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

作者:bladestone 时间:2022-03-15 17:43:35 

简介

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 插件

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

来源:https://blog.csdn.net/zhaoyanjun6/article/details/80743302

标签:Spring,Boot,lombok
0
投稿

猜你喜欢

  • Java新手环境搭建 JDK8安装配置教程

    2023-11-25 17:23:10
  • 解决mybatis一对多查询resultMap只返回了一条记录问题

    2022-07-08 08:36:31
  • 不使用Math.random方法生成随机数(随机数生成器)

    2021-11-28 05:08:46
  • Spring Security认证提供程序示例详解

    2022-11-07 18:06:40
  • SpringCloud之@FeignClient()注解的使用方式

    2022-05-16 04:22:40
  • SpringCloud Eureka服务治理之服务注册服务发现

    2021-12-27 15:07:16
  • Spring BeanFactory和FactoryBean区别解析

    2023-09-18 15:38:28
  • Spring @Transactional注解失效解决方案

    2022-10-25 05:30:30
  • 简单讲解java中throws与throw的区别

    2022-06-01 05:16:55
  • List调用toString()方法后,去除两头的中括号实例

    2023-09-28 11:18:56
  • Spring Cloud 配置中心内容加密的配置方法

    2023-02-11 09:05:15
  • Redis集群与SSM整合使用方法

    2023-07-02 02:17:05
  • SpringDataElasticsearch与SpEL表达式实现ES动态索引

    2021-11-27 01:33:03
  • Base64编码解码原理及C#编程实例

    2022-05-07 03:58:53
  • java循环练习的简单代码实例

    2023-11-23 21:20:28
  • java读取cvs文件并导入数据库

    2023-11-25 01:23:13
  • Spring AOP如何整合redis(注解方式)实现缓存统一管理详解

    2023-11-19 06:09:27
  • Java+Swing实现医院管理系统的完整代码

    2023-03-17 00:40:21
  • 基于Spring Boot不同的环境使用不同的配置方法

    2022-11-06 13:21:20
  • SpringBoot集成Redis流程详解

    2022-11-08 21:38:11
  • asp之家 软件编程 m.aspxhome.com