1. 程式人生 > >Spring Boot使用Lombok來優雅編碼

Spring Boot使用Lombok來優雅編碼

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

前言Lombok 是一種 Java™ 實用工具,可用來幫助開發人員消除 Java 的冗長,尤其是對於簡單的 Java 物件(POJO)。它通過註解實現這一目的。

正文

新增依賴

在 pom.xml 檔案中新增相關依賴:

<lombok.version>1.16.20</lombok.version>

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

安裝外掛

由於 Lombok 採取的註解形式的,在編譯後,自動生成相應的方法,為了不讓 ide 瘋了,需要下載外掛了支援它。 
以 idea 為例:查詢外掛 lombok plugin 安裝即可。

用我的 User 實體類為例(set,get,toString 方法),

@Getter
@Setter
@ToString
public class SysUserEntity implements Serializable

在按快捷鍵 Ctrl + F12,可以查詢到set,get,toString 方法。

註解

寫點常用的,其餘的 api 的開啟 Jar 包一目瞭然

@Getter

@Setter

@ToString

@EqualsAndHashCode

建構函式

@AllArgsConstructor

會生成一個包含所有變數,同時如果變數使用了NotNull annotation , 會進行是否為空的校驗, 
全部引數的建構函式的自動生成,該註解的作用域也是隻有在實體類上,引數的順序與屬性定義的順序一致。

@NoArgsConstructor

無參建構函式

@RequiredArgsConstructor

會生成一個包含常量(final),和標識了@NotNull的變數 的構造方法。

怎麼使用

它們都有三個引數可以設定 
1. String staticName() default "";

如果設定了它,將原來的構造方法的訪問修飾符將會變成 私有的,而外新增一個靜態構造方法,引數相同,名字是設定的字串的名字,訪問修飾符為公有的。

  1. AnyAnnotation[] onConstructor() default {}; 
    在構造方法上新增註解。使用方法@RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}

    例如我們在 Spring 專案中需要注入多個值,寫很多個 @Autowired 很麻煩,就可以使用這種方式:

    @Service
    @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    public class UserServiceImpl implements IUserService {
       private final IUserRepository userRepository;
       private final IOrderRepository orderRepository;
       ………………
    
  2. AccessLevel access() default lombok.AccessLevel.PUBLIC; 
    建構函式訪問修飾符;

  3. @NoArgsConstructor無參建構函式中還有個註解 boolean force() default false; 
    作者的註釋是 If {@code true}, initializes all final fields to 0 / null / false. Otherwise, a compile time error occurs.

    設定為 true 的時候,初始化所有的引數為預設值,否則編譯錯誤。

@Data

我自己嘗試了下,我們使用 @Data 註解就可以有下面幾個註解的功能: @ToString@Getter@Setter@EqualsAndHashCode@NoArgsConstructor 。注意的是,同時使用@Data 和 @AllArgsConstructor 後 ,預設的無參建構函式失效,如果需要它,要重新設定 @NoArgsConstructor

@Slf4j

//類上面註解了,直接呼叫 log 即可:
log.info(xxxx);

@Log

使用的是 java.util.logging.Logger ,直接使用 變數 log

@Builder

bulder 模式構建物件。

@Cleanup

@Cleanup 
InputStream in = new FileInputStream(args[0]);
@Cleanup 
OutputStream out = new FileOutputStream(args[1]);

自動化關閉流,相當於 jdk1.7 種的 try with resource

val

型別推導。

 val example = new ArrayList<String>();
 example.add("Hello, World!");

對應的轉換後代碼就是:

 val example = new ArrayList<String>();
 example.add("Hello, World!");

@NonNull

public NonNullExample(@NonNull Person person) {
    this.name = person.getName();
 }

轉換後就是:

public NonNullExample(@NonNull Person person) {
    if (person == null) {
      throw new NullPointerException("person");
    }
    this.name = person.getName();
 }

@SneakyThrows

翻譯就是暗中丟擲異常

當我們需要丟擲異常,在當前方法上呼叫,不用顯示的在方法名後面寫 throw

@SneakyThrows(Exception.class)

@Synchronized

方法中所有的程式碼都加入到一個程式碼塊中,預設靜態方法使用的是全域性鎖,普通方法使用的是物件鎖,當然也可以指定鎖的物件。

private final Object lock = new Object();
@Synchronized("lock")
public void foo() {
    // Do something
}

個人認為這樣的閱讀起來比較麻煩,實際開發中往往將 synchronized 顆粒化