原创

Lombok配置系统

温馨提示:
本文最后更新于 2022年11月16日,已超过 19 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

1.简介

在本教程中,我们将讨论Lombok的配置参数。我们将讨论许多不同的选项以及如何正确设置配置。

2.配置概述

Lombok 是一个帮助我们消除Java应用程序中几乎所有标准样板的库。我们将测试许多属性和配置。第一件事是添加Lombok 依赖:

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

Lombok的配置系统为我们提供了许多有价值的设置,这些设置通常在我们项目的所有组件中都是相同的。然而,它也允许我们更改或自定义Lombok的行为,有时甚至可以定义所有可用功能中可以使用或不能使用的功能。例如,如果使用了任何实验特性,我们可以告诉Lombok显示警告或错误。

要开始定义或自定义Lombok的行为,我们必须创建一个名为lombok.config的配置。 这个文件可以放在我们的项目、源代码或任何包的根目录下。一旦创建,子目录中的所有源文件都将继承此类文件中定义的配置。可以有多个配置文件。例如,我们可以在根目录中使用常规属性定义一个配置文件,并在给定的包中创建另一个定义其他属性的配置文件。

新的配置将影响给定包的所有类和所有子包。此外,在同一属性有多个定义的情况下,更接近类或成员的定义优先。

3.基本配置

首先要提到的一件事是要讨论的特性太多了。因此,我们将只看到最常见的。要查看可用选项,请转到 Lombok的页面,下载jar,并在终端中运行以下命令:

java -jar lombok.jar config -g --verbose

因此,我们将看到所有属性及其可能值的完整列表,以及解释其目标的简短描述。

现在,让我们看一个典型的 lombok.config配置 文件:

config.stopBubbling = true
lombok.anyconstructor.addconstructorproperties = false
lombok.addLombokGeneratedAnnotation = true
lombok.experimental.flagUsage = WARNING

# ... more properties

文件中使用的特性仅用于说明目的。我们稍后再讨论。但在这里,我们可以观察Lombok属性的格式及其定义。

让我们从 config.stopBubbling 属性-此选项告诉配置系统不要在父目录中搜索配置文件。最好将此属性添加到工作区或项目的根目录。默认情况下,其值为 false.

4.主要特性

4.1.全局配置密钥

全局配置键是可能影响许多配置系统本身的配置。接下来,我们将看到这些键的一些示例。

我们要讨论的第一个关键是Lombok.AnyBuilder.AddBuilderProperties。它添加了 @java.beans.ConstructorProperties注释到所有带参数的构造函数上。通常,在构造函数上使用反射的框架需要这个注释来映射属性,并知道构造函数中参数的正确顺序。以下是Lombok版本中的代码:

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Account {
    private double balance;
    private String accountHolder;
}

下面是生成的代码:

public class Account {
    private double balance;
    private String accountHolder;

    @ConstructorProperties({"balance", "accountHolder"})
    @Generated
    public Account(double balance, String accountHolder) {
        this.balance = balance;
        this.accountHolder = accountHolder;
    }
 
    @Generated
    public Account() {}

    // default generated getter and setters
}

在上面的代码段中,我们可以看到生成的包含 @ConstructorProperties 注释。

接下来,我们有 这个Lombok.addLombokGeneratedAnnotation。如果 true, Lombok 将为所有生成的方法携带 这个 @lombok.Generated注解。当从包扫描或代码覆盖工具中删除Lombok生成的方法时,这很有用.

另一个有用的关键是wallet.addNullAnnotation。此属性支持许多内置选项,如javax(JSR305)、eclipse、JetBrains、NetBeans、Android等。也可以使用我们自己定义的注释,例如 CUSTOM:com.example.NonNull:example.Nullable.Lombok将添加 nullableNotNull 到任何有定义的注释。

最后,我们有 lombok.addSuppressWarnings如果 true,Lombok停止添加注释 @SuppressWarnings(“all”) 这是当前的默认行为。如果我们在生成的代码上使用静态分析器,这很有用。

4.2.其他配置键

作为第一个特定功能键lombok.accessors.chain,如果 true,更改setter方法的行为。而不是 void返回, 这些方法将会返回 this。允许链接调用,如下所示:

@Test
void should_initialize_account() {
    Account myAccount = new Account()
      .setBalance(2000.00)
      .setAccountHolder("John Snow");

    assertEquals(2000.00, myAccount.getBalance());
    assertEquals("John Snow", myAccount.getAccountHolder());
}

与前一个类似lombok.accessors.fluent使Lombok删除前缀 setget 只使用属性名称来命名它们。

这个 lombok.log.fieldName 键在用户配置时更改生成的日志字段的名称。默认情况下 lombok.log.fieldName主要用途为日志 字段命名,但在我们的示例中,我们将其更改为 domainLog:

#Log name customization
lombok.log.fieldName = domainLog

然后我们可以看到它的实际作用:

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Log
public class Account {

    // same as defined previously

   public Account withdraw(double amount) {
        if (this.balance - abs(amount) < 0) {
            domainLog.log(Level.INFO, "Transaction denied for account holder: %s", this.accountHolder);
            throw new IllegalArgumentException(String.format("Not enough balance, you have %.2f", this.balance));
        }

        this.balance -= abs(amount);
        return this;
    }
}

下一个是lombok.(featureName).flagUsage。这组属性具有 warning, errorallow 作为可选值。 我们可以使用它们来控制在我们的项目中允许使用哪些 Lombok 功能.例如, 如果使用任何实验特征,可以用 实验的experimental 和值 warning 在日志中输出消息:

/home/dev/repository/git/tutorials/lombok/src/main/java/com/baeldung/lombok/configexamples/TransactionLog.java:9:
 warning: Use of any lombok.experimental feature is flagged according to lombok configuration.
@Accessors(prefix = {"op"})

4.3.特殊配置键

有些键不是常用的键值属性,如Lombok.CopyableAnnotations。该属性不同,因为它表示完全限定的注释类型列表。当添加到字段时,Lombok会将这些注释复制到与字段相关的构造函数、getter和setter。 此特性的典型用例是Spring的bean定义,其中注释 @Qualifier 和 @Value 通常必须复制到构造函数参数,其他框架也利用了此功能。

要向列表中添加注释,用户必须使用以下表达式: lombok.copyableAnnotations +=com.test.myAnnotation。库使用上述机制传播可为空的注释:

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Log
public class Account {

    @NonNull
    private Double balance = 0.;
    @NonNull
    private String accountHolder = "";

    // other methods
}

现在,Lombok生成的代码:

public class Account {

    @Generated
    private static final Logger domainLog = Logger.getLogger(Account.class.getName());
    @NonNull
    private Double balance = 0.0D;
    @NonNull
    private String accountHolder = "";

    @ConstructorProperties({"balance", "accountHolder"})
    @Generated
    public Account(@NonNull Double balance, @NonNull String accountHolder) {
        if (balance == null) {
            throw new NullPointerException("balance is marked non-null but is null");
        } else if (accountHolder == null) {
            throw new NullPointerException("accountHolder is marked non-null but is null");
        } else {
            this.balance = balance;
            this.accountHolder = accountHolder;
        }
    }

    @NonNull
    @Generated
    public Double getBalance() {
        return this.balance;
    }

    @NonNull
    @Generated
    public String getAccountHolder() {
        return this.accountHolder;
    }

    // Rest of the class members...

}

最后,我们有一个清除lombok.(anyConfigKey)指令。它将任何配置密钥恢复为其默认值。如果有人更改了任何父配置文件中给定键的值,它现在将被忽略。我们可以使用指令 清除 后面跟的任何Lombok配置键:

clear lombok.addNullAnnotations

4.4.文件指令

现在,我们对Lombok的配置系统的工作原理及其一些特性有了很好的了解。当然,这不是所有可用功能的广泛列表,但从这里开始,我们必须清楚地了解如何使用它。最后,让我们看看如何在当前配置文件中导入另一个文件中定义的配置。

要在另一个配置文件中导入配置文件,指令必须位于文件的顶部,并且路径可以是相对的或绝对的:

##     relative or absolute path  
import lombok_feature.config

config.stopBubbling = true
lombok.anyconstructor.addconstructorproperties=false
lombok.addLombokGeneratedAnnotation = true
lombok.addSuppressWarnings = false

仅为说明,导入的文件:

# lombok_feature.config file

lombok.experimental.flagUsage = warning

5.结论

在本文中,我们研究了Lombok的配置系统,它的不同属性,以及它们如何影响其功能。尽管如前所述,还有更多的选项可用,但我们只查看了最常见的选项。请随时查看 Lombok页面.

通常,本文中使用的所有代码示例都可用 在GitHub上.

正文到此结束