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)进行比较或替换,因为两者都是针对不同事物的不同工具。