当前位置:Java -> Spring Boot 中的记录处理

Spring Boot 中的记录处理

Java records在Spring Boot应用程序中完美地适用。让我们看看有几种情况,Java records可以帮助我们通过压缩同源代码来增加可读性和表现力。

在控制器中使用Records

通常,Spring Boot控制器使用简单的POJO类,将数据返回给客户端。例如,检查一下返回作者列表及其书籍的简单控制器端点:

@GetMapping("/authors")
public List<Author> fetchAuthors() {
  return bookstoreService.fetchAuthors();
}


在这里,Author(和Book)可以作为POJO的简单数据载体。但是,它们也可以被records替换。如下:

public record Book(String title, String isbn) {}
public record Author(String name, String genre, List<Book> books) {}


这样! Jackson库(它是Spring Boot中默认的JSON库)将自动将Author/Book类型的实例转换为JSON。在捆绑的代码中,通过localhost:8080/authors端点地址可以实践完整的示例。

在模板中使用Records

Thymeleaf可能是Spring Boot应用程序中最常用的模板引擎。Thymeleaf页面(HTML页面)通常由POJO类携带的数据填充,这意味着Java records也应该可以工作。

让我们考虑前面的AuthorBook records,以及以下控制器端点:

@GetMapping("/bookstore")
public String bookstorePage(Model model) {
  
  model.addAttribute("authors",
  bookstoreService.fetchAuthors());
  
  return "bookstore";
}


通过fetchAuthors()返回的List<Author>存储在模型中,命名为authors的变量。该变量用于填充bookstore.html如下:

...
<ul th:each="author : ${authors}">
  <li th:text="${author.name} + ' (' + ${author.genre} + ')'" />
  <ul th:each="book : ${author.books}">
    <li th:text="${book.title}" />
  </ul>
</ul>
...


完成!您可以在应用程序Java Coding Problems SE中查看。

使用Records进行配置

假设在application.properties中我们有以下两个属性(它们也可以在YAML中表示):

bookstore.bestseller.author=Joana Nimar
bookstore.bestseller.book=Prague history


Spring Boot通过@ConfigurationProperties将这些属性映射到POJO。但是,也可以使用record。例如,这些属性可以映射到BestSellerConfig record如下:

@ConfigurationProperties(prefix = "bookstore.bestseller")
public record BestSellerConfig(String author, String book) {}


接下来,在BookstoreService(一个典型的Spring Boot服务)中,我们可以注入BestSellerConfig并调用其访问器:

@Service
public class BookstoreService {
  
  private final BestSellerConfig bestSeller;

  public BookstoreService(BestSellerConfig bestSeller) {
    this.bestSeller = bestSeller;
  }
  
  public String fetchBestSeller() {
     return bestSeller.author() + " | " + bestSeller.book();
  }
}


捆绑的代码中,我们还添加了一个使用此服务的控制器。

Record和依赖注入

在前面的示例中,我们使用SpringBoot提供的典型机制—通过构造函数进行依赖注入BookstoreService服务注入BookstoreController

@RestController
public class BookstoreController {
  
  private final BookstoreService bookstoreService;
  
  public BookstoreController(BookstoreService bookstoreService) {
    this.bookstoreService = bookstoreService;
  }
  
  @GetMapping("/authors")
  public List<Author> fetchAuthors() {
    return bookstoreService.fetchAuthors();
  }
}


但是,我们可以通过如下方式将这个类简化为一个record:

@RestController
public record BookstoreController(BookstoreService bookstoreService) {
  
  @GetMapping("/authors")
  public List<Author> fetchAuthors() {
    return bookstoreService.fetchAuthors();
  }
}


这个record的规范构造函数将与我们的显式构造函数相同。该应用程序可以在GitHub上找到。

欢迎自由挑战自己,找到在Spring Boot应用程序中使用Java records的更多用例。

推荐阅读: 61.ThreadLocal原理和内存泄露?

本文链接: Spring Boot 中的记录处理