Spring Boot支援Java 16和新的Java記錄原始碼教程 | foojay

發表於2021-03-24

在本文中,我們將討論Records,它是Java 16的一項官方功能,並且在與Spring Boot應用程式結合使用時將應用此知識。

在本文中,我們將重點介紹JEP 395中定義的Java Records 。記錄最初是由JEP 359提出的,在JDK 14中作為預覽功能而引入,在JDK 15中,它們在JEP 384中仍處於預覽狀態。但是,在JDK 16中,記錄現在不再處於預覽狀態:它們已成為預覽的正式組成部分。

從2.5.0-M1版本開始,Spring Boot提供了對Java 16的初步支援。這裡有一個正常工作的Spring Boot應用程式,將使用它來演示Java記錄。原始碼可在此處獲得

這是一個簡單的Spring Boot應用程式,當通過/states或/state?name=statename REST端點進行訪問時,該應用程式將顯示所有或特定的印度州及其首都。該應用程式使用記憶體中的H2資料庫,該資料庫在應用程式的開始處插入行。

這是 State 這個record類:

public record State(String name, String capital) {}

StateRepository 實現:

import java.util.List;

public interface StateRepository {
    List<State> findAll();

    String findByName(String name);
}
@Service
public class StateService implements StateRepository{
    private final JdbcTemplate jdbcTemplate;

    public StateService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    private final RowMapper<State>  rowMapper = (rs, rowNum) -> new State(rs.getString("name"),rs.getString("capital"));

    @Override
    public List<State> findAll() {
        String findAllStates = """
                select * from States
                """;
        return jdbcTemplate.query(findAllStates, rowMapper);
    }

    @Override
    public String findByName(String name) {
        String findByName = """
                select capital from States where name = ?;
                """;
        return jdbcTemplate.queryForObject(findByName, String.class, name);
    }
}

注意:

BeanPropertyRowMapper不能與records記錄一起使用,因為它包括使用no-arg建構函式建立Java Bean的例項,然後呼叫其setter來填充Bean。但是記錄沒有no-arg建構函式,並且是不可變的,因此無法做二傳手。因此顯然BeanPropertyRowMapper不能與記錄一起使用。

 

您可能已經在使用Lombok批註,例如@ Value,如果與Java記錄不同,則最接近。然後,您可以擺脫一種依賴關係和那些註釋聖誕樹。我可能將事情簡化了一些,在某些情況下替換Lombok可能很有意義。但是您可能正在將Lombok用於其他功能,而不僅僅是它提供的一個註釋。並且相信我,儘管Java Records是Java愛好者的歡迎功能,但至少在目前,它不會取代Lombok。你不相信我?在StackOverflow上檢視Brain Goetz的答案

 

結論

在本文中,您瞭解了Records是不可變的資料載體類,它減少了我們習慣於編寫的樣板程式碼。然後,我們研究了Record類的內部,發現hashCode(),equals(),toString()和建構函式是由編譯器為我們隱式生成的。然後我們瞭解到您不應該真正地將Records與外部庫(例如Lombok)進行比較或替換,因為兩者都是針對不同事物的不同工具。

 

相關文章