eclipse 安装lombok插件(lombok常用注解的介绍与区别)

1.lombok简单介绍

  Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。(百度百科)

  简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省去我们手动创建这些代码的麻烦,它能够在我们编译源码的时候自动帮我们生成这些方法。

2.eclipse安装lombok插件

  第一步:下载lombok.jar包

  下载地址:https://projectlombok.org/download 

  比方说,我把该jar包下载到了桌面上

  第二步:打开黑窗口

  win+r--》cmd--》打开黑窗口--》切换到该jar包所在的上级目录

  第三步:运行lombok.jar

  输入命令:java -jar lombok.jar --》回车,会出现以下界面

  此时,正在寻找开发工具IDE的安装路径,找到后会出现如下界面

  当然,如果找的不对的话,或者你想切换成其它IDE,点击“Specify location...”,手动指定也是可以哒。 

  第四步:安装lombok

  点击上图右下角的Install/Update;

  此时,找到eclipse的安装目录,查看eclipse.ini文件,你将发现,会多出以下内容:

  这不是手动加上的,而是第四步安装后自动加上的。

  点击Quit Installer,完成安装

  结束后,eclipse的安装目录下会多一个lombok.jar包

  第五步:测试

  重启eclipse;

  在项目中添加jar包:lombok.jar;

  如果是maven项目,在pom.xml中添加:

<   dependency >
    <   groupId >org.projectlombok                
    <   artifactId >lombok                
    <   version >1.18.12                
    <   scope >provided                

  保存,Alt+F5--》更新maven项目;

import lombok.Builder;
import lombok.Data;

@Builder
public class Test {
    private String website;
    private String name;

    public static void main(String[] args) {
        TestBuilder test = Test.builder().website(                 "https://www.cnblogs.com/Marydon20170307/" ).name(                 "Marydon" );
        System.out.println(test.name +                  "的博客地址:" + test.website);
    }

}

3.idea安装lombok插件

打开设置项,找到"Plugins";

搜索:lombok,进行安装即可。

右侧有关于当前版本支持的注解明细及用法。

4.项目导包

除了开发工具需要安装lombok插件外,项目当中也需要引入lombok.jar包。

<!--lombok:实现get、set方法,链式编程,以及可以使用@Slf4j日志注解等-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <!--compile:默认值,表示当前依赖包,要参与当前项目的编译,后续测试,运行时,打包-->
    <scope>compile</scope>
</dependency>

5.lombok常用注解

@Setter

  @Setter :注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。

@Getter

  @Getter :使用方法同上,区别在于生成的是getter方法。

  @Getter(lazy=true) :实际使用到的时候生成。

@ToString

  @ToString :注解在类,为类提供toString方法。

@EqualsAndHashCode

  @EqualsAndHashCode: 注解在类,生成hashCode()和equals()方法。

默认情况下,生成包含所有非静态、非transient 字段的 equals 和 hashCode 方法。

@NoArgsConstructor

  @NoArgsConstructor: 注解在类,生成无参的构造方法。

@RequiredArgsConstructor

  @RequiredArgsConstructor: 注解在类,为类中需要特殊处理的字段生成构造方法,比如被final修饰和被@NonNull注解修饰的字段。

当我们往类上添加此注解后,如果该类没有需要特殊处理的字段,该注解不会生成任何代码的。(即不会生成无参构造方法)。

2024年3月5日19:52:30

我们可以使用它来完成spring对象的构造注入。

我们知道,spring注入对象有5种方式:

构造函数注入(Constructor Injection)

属性注入(Setter Injection)

字段注入(Field Injection)

方法注入(Method Injection)

配置类注入(Configuration Classes Injection)

先说字段注入。

如上图所示,我们现在需要注入6个spring管理的对象。

如果用构造函数注入的话,我们可以结合此注解来完成。

第一步,需要将被注入的对象用final修饰。

第二步,在类添加此注解。

当然,这不够标准,但不影响对象的注入。

标准的注解应该是:

@RequiredArgsConstructor(onConstructor = @__(@Autowired))

@RequiredArgsConstructor(onConstructor = @__(@Autowired)):用于在类中生成一个带有@Autowired注解的构造函数。

以上的代码等价于:

@Service
public class HealthRecordSetServiceImpl extends ServiceImpl<HealthRecordSetMapper, HealthRecordSet>
    implements IHealthRecordSetService {
    private final HealthRecordSetMapper healthRecordSetMapper;
    private final HealthRecordAssociationMapper healthRecordAssociationMapper;
    private final HealthRecordAuthorMapper healthRecordAuthorMapper;
    private final HealthRecordDocumentEntryMapper healthRecordDocumentEntryMapper;
    private final HealthRecordDocumentMapper healthRecordDocumentMapper;
    private final HealthRecordFolderMapper healthRecordFolderMapper;
    
    @Autowired
    public HealthRecordSetServiceImpl(HealthRecordSetMapper healthRecordSetMapper, HealthRecordAssociationMapper healthRecordAssociationMapper, HealthRecordAuthorMapper healthRecordAuthorMapper,HealthRecordDocumentEntryMapper healthRecordDocumentEntryMapper,HealthRecordDocumentMapper healthRecordDocumentMapper, HealthRecordFolderMapper healthRecordFolderMapper){
        this.healthRecordSetMapper = healthRecordSetMapper;
        this.healthRecordAssociationMapper = healthRecordAssociationMapper;
        this.healthRecordAuthorMapper = healthRecordAuthorMapper;
        this.healthRecordDocumentEntryMapper = healthRecordDocumentEntryMapper;
        this.healthRecordDocumentMapper = healthRecordDocumentMapper;
        this.healthRecordFolderMapper = healthRecordFolderMapper;
    }
}    

@AllArgsConstructor

  @AllArgsConstructor: 注解在类,生成包含类中所有字段的构造方法。

@NoArgsConstructor(force = true)

  @NoArgsConstructor(force = true): 注解在类,生成无参的构造方法,并将字段设置为 final。

@AllArgsConstructor(force = true)

  @AllArgsConstructor: 注解在类,生成包含类中所有字段的构造方法,并将字段设置为 final。

@EqualsAndHashCode(callSuper = true)

生成包含父类字段的 equals 和 hashCode 方法。

@Data

  @Data: 注解在类,生成setter/getter()、equals()、canEqual()、hashCode()、toString()方法,如为final属性,则不会为该属性生成setter方法。

  相当于:@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。

@Slf4j

  @Slf4j: 注解在类,生成log变量,严格意义来说是常量。

@Builder

  @Builder:注解在类、构造函数或方法上,生成builder()方法,根据该方法来完成对类的私有属性的取值和赋值工作,但是无法调取到自定义的方法。

2024年2月28日16:37:36

注意:

当使用@Builder注解后,将无法通过new来创建对象

因为此注解会将构造方法私有化。

具体报错信息如下:

'HealthRecordSet(java.lang.Long, java.lang.String, java.lang.String, java.lang.String, java.time.LocalDateTime, java.lang.String, java.lang.String, ...)' is not public in 'com.xx.datagather.sharedocument.hrs.domain.HealthRecordSet'. Cannot be accessed from outside package

仍然需要传统的构造函数,百度AI说可以考虑同时使用@RequiredArgsConstructor注解。

这样一来,虽然idea不报错了,但实际上在编译的时候,还是会报错的。

意思是:需要无参构造方法,但只找到了有参构造方法。

所以说,当使用@Builder注解后,将无法通过new来创建对象,只能通过“类名.builder.buid()”来实例化对象

2025-04-02 10:28:58

如果我们在使用@Builder注解的同时,仍然希望通过new来创建对象,我们需要添加两个注解@NoArgsConstructor和@AllArgsConstructor。

@Builder
@NoArgsConstructor
@AllArgsConstructor

 

@Builder.Default

@Builder.Default 是 Lombok 提供的一个注解,用于为类的字段设置默认值。

当使用 @Builder 注解生成构建器模式时,被该注解修饰的属性如果没有显式赋值,Lombok 会自动为其赋予指定的默认值。

@ApiModelProperty("处方明细")
@Builder.Default
private List<QycfDetailsVo> qycfDetailsVoList = new ArrayList<>();

 如果在构建对象时没有为 qycfDetailsVoList 赋值,则使用 null 作为默认值。 

@Accessors

       @Accessors(chain = true):注解在类上,和@Builder搭配使用,如果只有此注解,没有@Builder的话,该注解将毫无意义,无法单独使用。

@NonNull

  @NonNull:生成非空检查代码,可以帮助我们避免空指针;

  注解在参数上, 如果该类参数为 null , 就会报出异常,  throw new NullPointException(参数名)

@Cleanup

  @Cleanup: 用在流上,流读取完毕后,会自动帮我们调用close()方法

  注释在引用变量前, 自动回收资源。默认调用 close() 方法。

  2022年9月21日16:16:29

@Value

  @Value:@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,自动生成 getter 方法(不会生成set方法)。

@Synchronized

  @Synchronized: 注解在方法上, 为方法提供同步锁。

@Log4j

  @Log4j: 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象。

@Slf4j

  @Slf4j: 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象。

  搞不明白的可以自己写一个例子,然后用反编译文件看看到底注解转换成了什么样的代码。

2023年10月11日18:18:22

@Default

lombok中的@Builder.Default注解为成员变量赋默认值。

该注解的作用是:为类的指定属性增加默认值(即:完成初始化)。

@Builder.Default
private String fieldiskeyTarget = "";

说明:当项目当中存在两个以上的@Default注解时,我们需要注意,使用的是:lombok的@Default注解。

在java当中,当声明类的属性的类型为非基础数据类型时,如果没有进行初始化,它的值,默认为null。

这样的数据,在返回前端(进行序列化)时,没有进行初始化的属性值,也就成了null。

如果想返回空字符串,需要我们手动将属性值赋空字符""。

或者,使用lombok的@Default注解,并将属性的默认值为空字符""。

@SneakyThrows

在方法体中自动捕捉并重新抛出异常,无需显式地进行异常处理。

@Wither

 自动生成属性的不可变更新方法。

2022年6月2日10:13:28

常见用法1

@Getter
@Setter
// 通过new进行实例化对象
@NoArgsConstructor
@AllArgsConstructor
// 通过build()进行实例化
@Builder
@Accessors(chain = true)

如果既想通过@Builder实例化对象,又想通过new来实例化对象,必须在类上声明两个关于构造函数的注解,即:

@NoArgsConstructor和@AllArgsConstructor;

常见用法2

@Getter
@Setter
// 只通过build()进行实例化,不通过new创建
@Builder
@Accessors(chain = true)

如果只通过@Builder来实例化对象的话,不需要声明@NoArgsConstructor和@AllArgsConstructor;

常见用法3

@Getter
@Setter
// 只通过new来实例化对象,无需使用其它注解

如果只需要通过new来实例化对象的话,同样,也不需要声明@NoArgsConstructor和@AllArgsConstructor;

如何通过@Builder构造的对象,获取到变量的默认值?

需要在设置默认值的成员变量上,添加注解:@Builder.Default。

另外,8种基本数据类型的默认值,@Builder是可以正常获取到的,不需要加@Builder.Default。

通过对象拿到基本数据类型字段值,不是通过get()方法,而是直接调用:字段名称+();

System.out.println(msgConfig.isSuccess());

2024年2月2日10:17:11

6.补充说明

当你所在的公司/团队禁止使用 Lombok 插件,只允许使用传统的方式来写get、set、toString这些基础方法,有没有方式能快速生成这些繁琐的体力活儿呢?IDEA 其实已经帮我们内置了快速生成这些方法的功能。

按下快捷键Alt + Insert;

或者在对象中点击鼠标右键,选择Generate...

选择你要生成的内容,就能快速生成对应的方法。

eclipse对应的快捷键是:Alt+Shift+s。

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

posted @ 2020-07-07 17:34  Marydon  阅读(9933)  评论(0)    收藏  举报