核心目标该机制的核心目标就是通过在编译时进行静态代码检查防止运行时抛出空指针异常。SpringBoot4.0默认集成JSpecify框架支持使用JSpecify注解来声明API、字段及相关类型的可空性。举个例子现在有一个接口和实现类public interface TokenExtractorService { String extractToken(String input); } Service public class TokenExtractorServiceImpl implements TokenExtractorService { Override public String extractToken(String input) { return input; } }我们想要在编译期就能表达入参不允许为null返回允许为null该如何来做呢可空性设置我们可以使用NonNull和Nullable注解来说明这些类型的可空性。具体来说可以有两种方式显式设置和隐式统一设置。显式设置可空性只需要在参数和返回上分别添加对应的注解即可public interface TokenExtractorService { Nullable String extractToken(NonNull String input); } Service public class TokenExtractorServiceImpl implements TokenExtractorService { Override public Nullable String extractToken(NonNull String input) { return input; } }NonNull不能为空Nullable 可以为空加完这些标记以后当我们调用这个方法的时候IDEA就会有对应的错误提示GetMapping(/demo) public String demo(){ String token tokenExtractorService.extractToken(null); return token.toUpperCase(); }以上代码IDEA会给出2个警告隐式设置可空性大多数情况下我们一般默认这些参数、返回、字段、类型都是非空的因此只需要明确的说明可空即可因此我们还可以在包级别统一设置默认的可空性这个可以借助package-info.java来实现。首先在service包下面添加package-info.javaNullMarked package com.github.xjs.service; import org.jspecify.annotations.NullMarked;NullMarkedcom.github.xjs.service这个包下面所有的参数、返回、字段、类型默认都是不允许为空NullUnmarked默认都允许为空一般很少用此时就可以删除代码中的NonNull注解只保留Nullable即可public interface TokenExtractorService { Nullable String extractToken(String input); } Service public class TokenExtractorServiceImpl implements TokenExtractorService { Override public Nullable String extractToken(String input) { return input; } }