当前位置:Java -> Spring Boot 中的记录处理
Java records在Spring Boot应用程序中完美地适用。让我们看看有几种情况,Java 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端点地址可以实践完整的示例。
Thymeleaf可能是Spring Boot应用程序中最常用的模板引擎。Thymeleaf页面(HTML页面)通常由POJO类携带的数据填充,这意味着Java records也应该可以工作。
让我们考虑前面的Author
和Book
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中查看。
假设在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();
}
}
在捆绑的代码中,我们还添加了一个使用此服务的控制器。
在前面的示例中,我们使用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 中的记录处理