7.Null-safety

虽然Java不允许用它的类型系统来表示null-safety,但是Spring框架现在在org.springframework.lang包中提供以下注解,以允许你声明API和字段的可空性:

@Nullable:注解,指示特定参数、返回值或字段可以为空。 @NonNull:表示特定参数、返回值或字段不能为空的注解(对于分别应用@NonNullApi 和@NonNullFields的参数/返回值和字段不需要)。 @NonNullApi:包级别的注解,声明非空作为参数和返回值的默认语义。 @NonNullFields:包级别的注解,声明非空字段作为字段的默认语义。

Spring框架本身利用这些注解,但它们也可以用于任何基于Spring的Java项目中,以声明 null-safe API和可选的 null-safe 字段。尚不支持泛型类型参数、varargs和数组元素为空性,但应在即将发布的版本中提供,有关最新信息,请参阅spr-15942。可以为空性声明预计将在Spring框架版本之间进行微调,包括较小的版本。方法体内部使用的类型的Nullability超出了此功能的范围。

其他公共库(如Reactor和spring data)提供了null-safe API,这些API使用类似的空性安排,为spring应用程序开发人员提供了一致的总体体验。

7.1 使用案例

除了为SpringFrameworkAPI的可空性提供显式声明外,这些注解还可以由一个IDE(如IDEA或Eclipse)使用,以提供与null-safety相关的有用警告,以避免在运行时发生NullPointerException。

它们还用于在Kotlin项目中使SpringAPI为空,因为Kotlin本身支持空安全。Kotlin支持文档中提供了更多详细信息。

7.2 JSR-305 元注解

Spring注解是用JSR 305注解(一个隐藏的,但广泛分布的JSR)进行元注解的。JSR-305元注解允许工具供应商(如IDEA或Kotlin)以通用的方式提供空安全支持,而无需对Spring注解进行硬编码支持。

没有必要也不建议向项目类路径添加JSR-305依赖项,以利用Spring空安全API。只有基于Spring的库等项目在其代码库中使用空安全注解时,才应添加com.google.code.findbugs:jsr305:3.0.2和compileOnly Gradle配置或maven provided范围以避免编译警告。