自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用Java 17的Records加速Spring Boot開發(fā)

開發(fā) 項(xiàng)目管理
record是一種特殊類型的類聲明,目的是為了減少樣板代碼。record引入的主要目的是快速創(chuàng)建數(shù)據(jù)載體類。

在《??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類:

@Data
public class Point {
private String x;
private String y;
}

record:

public record Point(String x, String y) {
}

我們創(chuàng)建一個(gè)簡(jiǎn)單的演示項(xiàng)目,依賴如圖所示:

2、使用record替代普通DTO

我們?cè)赟pring MVC的控制器中可以用一個(gè)record的DTO來(lái)接受前端傳遞來(lái)的數(shù)據(jù):

@RestController
@RequestMapping("/people")
public class PersonController {

private final PersonService personService;

public PersonController(PersonService personService) {
this.personService = personService;
}

@PostMapping
public ResponseEntity<Person> save(@RequestBody PersonDto personDto){
return ResponseEntity.ok(personService.save(personDto));
}

@GetMapping("/findByLastName")
public ResponseEntity<List<PersonOnlyWithName>> findByLastName(String lastName){
return ResponseEntity.ok(personService.findByLastName(lastName));
}
}

上面的PersonDto是一個(gè)record:

public record PersonDto(String firstName, String lastName,Integer age) {
}

3、使用record作為Spring的Bean

上面注入的PersonService,是一個(gè)Spring的Bean,它同樣可以是一個(gè)record,我們只需要在record的參數(shù)里寫上要被注入的bean,這個(gè)bean就會(huì)自動(dòng)被注入:

@Service
public record PersonService(PersonRepository personRepository){

//保存person
public Person save(PersonDto personDto){
Person person = new Person(personDto.firstName(), personDto.lastName(), personDto.age());
return personRepository.save(person);
}

//按照l(shuí)astName查詢people,返回值只有firstName和lastName
public List<PersonOnlyWithName> findByLastName(String lastName){
return personRepository.findByLastName(lastName);
}
}

在這里的PersonRepository的bean可以自動(dòng)被注入,代碼上比屬性@Autowired注入,甚至構(gòu)造器注入代碼更簡(jiǎn)潔。

Spring Data JPA用作數(shù)據(jù)訪問(wèn)的Repository:

public interface PersonRepository extends JpaRepository<Person, Long> {

List<PersonOnlyWithName> findByLastName(String lastName);
}

使用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)容為:

public record PersonOnlyWithName(String firstName, String lastName) {
}

即我們查詢返回的結(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。

@RestController
@RequestMapping("/people")
public record PersonController(PersonService personService) {

@PostMapping
public ResponseEntity<Person> save(@RequestBody PersonDto personDto){
return ResponseEntity.ok(personService.save(personDto));
}

@GetMapping("/findByLastName")
public ResponseEntity<List<PersonOnlyWithName>> findByLastName(String lastName){
return ResponseEntity.ok(personService.findByLastName(lastName));
}
}

代碼比構(gòu)造器注入更精簡(jiǎn)。

文章出自:??愛科學(xué)的衛(wèi)斯理??,如有轉(zhuǎn)載本文請(qǐng)聯(lián)系愛科學(xué)的衛(wèi)斯理今日頭條號(hào)。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2016-10-14 14:16:28

Spring BootJava應(yīng)用

2018-05-25 16:32:45

Spring BootJava開發(fā)

2023-05-29 08:43:46

SpringJava

2019-01-15 11:40:14

開發(fā)技能代碼

2022-11-08 07:46:28

record類聲明代碼

2018-05-31 15:30:11

JavaSpring Boot應(yīng)用開發(fā)

2025-02-05 12:28:44

2013-07-01 10:07:44

JavaSpringHibernate

2019-04-15 08:32:25

Spring Boot日志門面模式

2024-10-18 11:32:15

2019-01-31 13:43:48

Spring BootStarter開發(fā)

2017-08-02 14:44:06

Spring Boot開發(fā)注解

2013-07-04 13:19:24

Java開發(fā)速度

2023-10-31 07:48:22

QuarkusJava

2019-03-28 11:07:56

Spring BootRedis緩存

2016-11-03 09:59:38

kotlinjavaspring

2017-03-06 15:43:33

Springboot啟動(dòng)

2013-07-04 13:37:23

Java開發(fā)速度

2021-01-06 10:09:05

Spring Boothttps sslhttps

2025-02-19 12:00:00

SpringBootDeepSeekAI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)