Null-safety

尽管 Java 无法让你用其类型系统表示空安全性,但 Spring Framework 提供了 org.springframework.lang 包中的以下注释,让你声明 API 和字段的空值性:

  • @Nullable:表示特定参数、返回值或字段可以是 `null`的注释。

  • @NonNull:表示某个特定参数、返回值或字段不能是 `null`的注释(对于 `@NonNullApi`和 `@NonNullFields`分别适用的参数、返回值和字段不需要)。

  • @NonNullApi:一个包级别的注释,将非空声明为参数和返回值的默认语义。

  • @NonNullFields:一个包级别的注释,将非空声明为字段的默认语义。

Spring Framework 本身利用了这些注释,但它们也可以在任何基于 Spring 的 Java 项目中使用,以声明 null 安全 API 和可选的 null 安全字段。暂不支持泛型类型参数、变长参数和数组元素的空值声明。预计空值声明将在 Spring Framework 的版本之间进行微调,包括次要版本。方法体中使用的类型的空值不在此功能的范围内。

其他常见库(如 Reactor 和 Spring Data)提供了使用类似空值安排的空安全 API,为 Spring 应用程序开发人员提供了始终如一的整体体验。

Use cases

除了为 Spring Framework API 空值提供明确的声明之外,这些注释还可由 IDE(如 IDEA 或 Eclipse)使用,以提供有关 null 安全性的有用警告,从而避免在运行时出现 NullPointerException

它们还用于在 Kotlin 项目中使 Spring API 具有 null 安全性,因为 Kotlin 本机支持 null 安全性。更多详细信息可在 Kotlin 支持文档中找到。

JSR-305 meta-annotations

Spring 注释使用 https://www.jcp.org/en/jsr/detail?id=305 注释(一种休眠但广泛使用的 JSR)进行元注释。JSR-305 元注释允许诸如 IDEA 或 Kotlin 的工具供应商以通用方式提供 null 安全支持,而无需为 Spring 注释硬编码支持。

不必也不建议将 JSR-305 依赖项添加到项目的类路径,以利用 Spring 的 null 安全 API。只有在代码库中使用 null 安全注释的项目(例如基于 Spring 的库)才应使用 com.google.code.findbugs:jsr305:3.0.2 添加 compileOnly Gradle 配置或 Maven provided 范围,以避免编译器警告。