问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spring Boot中Lombok插件的详细使用指南

创作时间:
作者:
@小白创作中心

Spring Boot中Lombok插件的详细使用指南

引用
1
来源
1.
https://www.cnblogs.com/TheMagicalRainbowSea/p/18392433

Lombok是一个Java库,它通过注解简化了Java Bean的开发,可以自动生成getter、setter、toString等方法,从而让代码更加简洁。在Spring Boot项目中使用Lombok,可以进一步提高开发效率。本文将详细介绍Lombok在Spring Boot中的使用方法。

Lombok介绍

Lombok的主要作用是简化Java Bean的开发,可以使用Lombok的注解让代码更加简洁。在Java项目中,很多没有技术含量但又必须存在的代码,比如Pojo的getter/setter/toString,异常处理:I/O流的关闭操作等等,这些代码既没有技术含量,又影响着代码的美观,Lombok应运而生。

Spring Boot和IDEA官方都支持Lombok:

  • IDEA 2020已经内置了Lombok插件
  • Spring Boot 2.1.x之后的版本也在Stater中内置了Lombok依赖

Lombok常用注解

下面是Lombok的一些常用注解:

@Data:注解在类上,提供类所有属性的getting和setting方法,此外还提供了equals,canEqual,hashCode,toString方法
@Setter: 注解在属性上,为属性提供 setting 方法,注解在类上,则为类中的所有属性提供 set()方法。
@Getter: 注解在属性上,为属性提供 getting 方法注解在类上,则为类中的所有属性提供 get()方法。
@Log4j:注解在类上:为类提供了一个属性名为: log 的 log4j的日志对象
@NoArgsConstructor: 注解在类上,为类提供一个无参的构造方法,(一定会提供)
@AllArgsConstructor: 注解在类上,为类提供一个全参的构造方法
@Cleanup: 可以关闭流
@Builder: 被注解的类加个构造者模式
@Synchronized: 加同步锁 
@SneakyThrows: 等同于try/catcher捕获异常
@NonNull:如果给参数加个这个注解,参数为null会抛出空指针异常
@Value: 注解和@Value类似,区别在于它会把所有成员变量默认定义为 private final 修饰,并且不会生产set()方法 

下面我们测试,使用几个,在开发中比较常用的注解。

首先想要使用上Lombok需要导入相关jar依赖,也可以不用特别导入,直接使用Spring Boot自带内置的即可。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.rainbowsea</groupId>
    <artifactId>springboot_lombok</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--    导入SpringBoot 父工程-规定写法-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
    </parent>
    <dependencies>
        <!--    导入web项目场景启动器:会自动导入和web开发相关的jar包所有依赖【库/jar】-->
        <!--    后面还会在说明spring-boot-starter-web 到底引入哪些相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--        引入 lombok ,使用版本仲裁-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

@ToString

@ToString:// 在编译时,生成toString,注意:默认情况下,会生成一个无参构造器。

package com.rainbowsea.springboot.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@ToString  // 在编译时,生成 toString,注意:默认情况下,会生成一个无参构造器
public class Furn {
    private Integer id = 100;
    private String name = "张三";
    private Double price = 999.0;
}

使用lombok注解简化代码,可以通过idea自带的反编译功能target,看Furn.class的源码,就可以看到生成的完整代码。如果目录当中没有target目录显示,可以进行如下操作:

@Setter

@Setter注解:注解在属性上,为属性提供setting方法,注解在类上,则为类中的所有属性提供set()方法。

首先,我们先注解使用在属性上。

package com.rainbowsea.springboot.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
public class Furn {
    @Setter // 注解在属性上,编译生成一个,该属性的 set()方法:默认情况下,会生成一个无参构造器
![](https://wy-static.wenxiaobai.com/chat-rag-image/3015690303502685016)
    private Integer id = 100;
    private String name = "张三";
    private Double price = 999.0;
}

添加到类上,为类中所有的属性都添加,set()方法。

@Data

@Data:注解在类上,提供类所有属性的getting和setting方法,此外还提供equals,canEqual,hashCode,toString方法,@RequiredArgsConstructor

特别说明:@Data中的@RequiredArgsConstructor

在我们写controller或是Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很乱。Lombok提供了一个注解:

@RequiredArgsConstructor(onConstructor=@_(@AutoWired))

写在类上可以代替@Autowired注解,需要注意的时在注入时,需要用final定义,或者使用@notnull注解

package com.rainbowsea.springboot.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Data// 注解等价使用了,如下注解: @Getter,@Setter,@RequiredArgsConstructor @ToString,@EqualsAndHas
public class Furn {
    private Integer id = 100;
    private String name = "张三";
    private Double price = 999.0;
}
![](https://wy-static.wenxiaobai.com/chat-rag-image/7950299802234732260)

@AllArgsConstructor

@AllArgsConstructor:在编译时,会生成全参数构造器

package com.rainbowsea.springboot.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@AllArgsConstructor // 在编译时,会生成全参数构造器
public class Furn {
    private Integer id = 100;
    private String name = "张三";
    private Double price = 999.0;
}

注意:这里:我们会发现一点,就是有全参数构造器,但是,却没有生成一个默认的“无参数构造器”

@NoArgsConstructor

@NoArgsConstructor:在编译时,会生成无参构造器(一定会生成),不会受到其它的影响

package com.rainbowsea.springboot.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor //在编译时,会生成无参构造器(一定会生成),不会受到其它的
public class Furn {
![](https://wy-static.wenxiaobai.com/chat-rag-image/11208264243183072290)
    private Integer id = 100;
    private String name = "张三";
    private Double price = 999.0;
}

特别说明:
特别说明,虽然上面的@Data,@ToString注解等等,默认情况下都会生成一个无参构造器,但是当你使用了多个注解的时候,可能会覆盖掉无参构造器。但是当我们有其它多个构造器生成时,你如果你希望仍然有无参构造器就需要使用@NoArgsConstructor注解了,因为@NoArgsConstructor注解,在编译时,会生成无参构造器(一定会生成),不会受到其它的影响,被覆盖。如图

特别说明:
特别说明,虽然上面的@Data,@ToString注解等等,默认情况下都会生成一个无参构造器,但是当你使用了多个注解的时候,可能会覆盖掉无参构造器。但是当我们有其它多个构造器生成时,你如果你希望仍然有无参构造器就需要使用@NoArgsConstructor注解了,因为@NoArgsConstructor注解,在编译时,会生成无参构造器(一定会生成),不会受到其它的影响,被覆盖。如图

在IDEA中安装Lombok插件

不装插件也可以用基本的注解比如:@Data,@Getter...但是不能使用其扩展功能,比如日志输出...,所以我们还是安装一下,也比较简单。直接去插件商城,搜索:Lombok即可

package com.rainbowsea.springboot.controller;
import com.rainbowsea.springboot.bean.Furn;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController  // @Controller + @ResponseBody
public class HiController {
    @Autowired
    private Furn furn;
    @RequestMapping("/hi") // 设置请求映射路径
    public String hi(){
        log.info("furn-"+furn);
        // 占位符方式输出
        log.info("furn={} myfurn={}",furn,furn);
![](https://wy-static.wenxiaobai.com/chat-rag-image/11581127509824027488)
        return  "hi word";
        // 使用 slf4j日志输出
    }
}

运行测试:

总结

  • 熟悉常用的Lombok注解,提供开发效率。
  • 基本上@注解都会生成一个默认的无参构造器,但是当存在多个注解的时候,这个默认的无参构造器,可能会被覆盖掉,从而导致无法不会被生成。但是,框架的上的使用,基本上都是需要使用上反射机制的,而反射机制是必须要有一个无参构造器才可以进行反射,获取到对应的Bean对象。给框架使用。所以,一般的bean对象都会添加上一个@NoArgsConstructor注解该在编译时,会生成无参构造器(一定会生成),不会受到其它的影响
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号