Spring Boot支援Java 16和新的Java記錄原始碼教程 | foojay
在本文中,我們將討論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)進行比較或替換,因為兩者都是針對不同事物的不同工具。
相關文章
- 結合GraalVM與Spring Native的Spring Boot原始碼教程 | foojayLVMSpring Boot原始碼
- java工程管理系統原始碼+spring cloud + spring bootJava原始碼CloudSpring Boot
- java+spring cloud + spring boot工程管理系統原始碼JavaCloudSpring Boot原始碼
- 使用Spring Boot排程WebSocket推送的教程和原始碼 - BaeldungSpring BootWeb原始碼
- Spring Boot 記錄Spring Boot
- 【Java】Java新特性--Records記錄型別Java型別
- Spring Boot的Clean架構教程與原始碼 - BaeldungSpring Boot架構原始碼
- Java Spring Boot 學習筆記(一)JavaSpring Boot筆記
- 開始使用GraphQL Java和Spring BootJavaSpring Boot
- spring boot碼雲原始碼Spring Boot原始碼
- Spring Boot系列(四):Spring Boot原始碼解析Spring Boot原始碼
- Spring Boot中實現規則引擎原始碼教程Spring Boot原始碼
- 長沙Java培訓教程:Spring Boot準備知識和技術JavaSpring Boot
- java版Spring Cloud+Spring Boot+Mybatis實現工程管理系統原始碼JavaCloudSpring BootMyBatis原始碼
- Spring Boot 和 Thymeleaf 實現 Java 版 HTMXSpring BootJava
- Java Web之Spring BootJavaWebSpring Boot
- Java 9 中的ofNullable方法 | foojayJavaNull
- Spring Boot 2.5.0 釋出:支援Java16、Gradle 7、Datasource初始化機制調整Spring BootJavaGradle
- Java 9 和Spring Boot 2.0紛紛宣佈支援的HTTP/2到底是什麼?JavaSpring BootHTTP
- Spring Boot 2.5.x能支援Java 17了 - codecentricSpring BootJava
- Spring Boot的微服務分散聚集模式教程與原始碼 - vinsguruSpring Boot微服務模式原始碼
- 學習記錄Spring Boot 記錄配置細節Spring Boot
- Spring Boot和Netflix DGS的GraphQL原始碼案例Spring Boot原始碼
- 使用Spring Boot和Elasticsearch教程Spring BootElasticsearch
- Spring Boot + JPA DataTable原始碼Spring Boot原始碼
- spring-boot記錄sql探索SpringbootSQL
- 34套Java專案教程+原始碼包含Java swing專案 Java web專案 Java控制檯專案(視訊教程+原始碼)Java原始碼Web
- Java 原始碼,反碼和補碼Java原始碼
- Spring Boot系列(三):Spring Boot整合Mybatis原始碼解析Spring BootMyBatis原始碼
- 從原始碼探究JAVA的equals和==原始碼Java
- 為什麼Java大神,都在看Spring Boot和Spring Cloud的書?JavaSpring BootCloud
- Java之Spring Boot詳解JavaSpring Boot
- 利用spring boot建立java appSpring BootJavaAPP
- 精盡Spring Boot原始碼分析 - 支援外部 Tomcat 容器的實現Spring Boot原始碼Tomcat
- 使用不可變Java記錄Record來避免多執行緒併發錯誤 - foojayJava執行緒
- spring boot基於Java的容器配置Spring BootJava
- Java CRaC 上的Spring Boot3JavaSpring Boot
- Spring 4 支援的 Java 8 功能SpringJava