用Java 17的Records加速Spring Boot開發(fā)
在《??Spring Boot 2.6新特性:使用Java 17的Record作為配置屬性??》,我們提到了使用Java Records來(lái)作為Spring Boot的配置屬性(configuration properties),從而減少了大量樣板代碼的編寫,我們本篇將進(jìn)一步拓展Records在Spring Boot下的應(yīng)用場(chǎng)景,從而進(jìn)一步減少我們的樣板代碼,使代碼看上去更簡(jiǎn)潔清晰。
1、什么是Records
record是一種特殊類型的類聲明,目的是為了減少樣板代碼。record引入的主要目的是快速創(chuàng)建數(shù)據(jù)載體類。
這種類的主要目的就是在不同的模塊或者層之間包含并傳遞數(shù)據(jù),它們表現(xiàn)為POJO(Plain Old Java Objects)和DTO(Data Transfer Objects)。
record聲明有專門的的關(guān)鍵字record,我們比較下一個(gè)簡(jiǎn)單的POJO類和record上語(yǔ)法的區(qū)別:
POJO類:
record:
我們創(chuàng)建一個(gè)簡(jiǎn)單的演示項(xiàng)目,依賴如圖所示:
2、使用record替代普通DTO
我們?cè)赟pring MVC的控制器中可以用一個(gè)record的DTO來(lái)接受前端傳遞來(lái)的數(shù)據(jù):
上面的PersonDto是一個(gè)record:
3、使用record作為Spring的Bean
上面注入的PersonService,是一個(gè)Spring的Bean,它同樣可以是一個(gè)record,我們只需要在record的參數(shù)里寫上要被注入的bean,這個(gè)bean就會(huì)自動(dòng)被注入:
在這里的PersonRepository的bean可以自動(dòng)被注入,代碼上比屬性@Autowired注入,甚至構(gòu)造器注入代碼更簡(jiǎn)潔。
Spring Data JPA用作數(shù)據(jù)訪問(wèn)的Repository:
使用record來(lái)聲明bean,有一些潛在的問(wèn)題:
1、record中,被注入的對(duì)象在當(dāng)前對(duì)象里其實(shí)是有一個(gè)隱藏的get方法:“personService.personRepository()”,這違反了信息隱藏的封裝原則。
2、record定義了equals和hasCode方法,作為service并不需要。
3、service的變量屬性一般都是final。
如果上述的東西對(duì)你并沒(méi)有什么影響,你可以自由決定是否使用。
3、使用record作為Spring Data JPA的projection
Spring Data JPA的projection目的是定制查詢的數(shù)據(jù)返回,而不是返回整個(gè)實(shí)體。一般情況下都是使用接口或者dto類,現(xiàn)在支持使用record。
定制的返回的record內(nèi)容為:
即我們查詢返回的結(jié)果,不需要id和age,只需要firstName和lastName。
4、演示應(yīng)用
啟動(dòng)程序,保存Person,插入兩條數(shù)據(jù):
按照l(shuí)astName查詢,查看我們projection的效果:
用record改造Controller控制器
在上面我們的Controller用的還是普通的class,既然record可以聲明為bean并注入bean,那我們改造一下上面的Controller。
代碼比構(gòu)造器注入更精簡(jiǎn)。
文章出自:??愛科學(xué)的衛(wèi)斯理??,如有轉(zhuǎn)載本文請(qǐng)聯(lián)系愛科學(xué)的衛(wèi)斯理今日頭條號(hào)。