尽管 Java 不允许你用它的类型系统来表达 null-safety,但 Spring 框架 在包中提供了以下注释,让您 声明 API 和字段的可为 null:org.springframework.lang

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

  • @NonNull:表示特定 参数、返回值或字段不能是(参数、返回值、 和字段,其中 和 应用)。null@NonNullApi@NonNullFields

  • @NonNullApi:包级别的注释 将 non-null 声明为参数和返回值的默认语义。

  • @NonNullFields:包上的注释 将 non-null 声明为字段的默认语义的级别。

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

其他常用库(如 Reactor 和 Spring Data)提供 null 安全 API,这些 API 使用类似的可空性安排,为 Spring 应用程序开发人员。

使用案例

除了为 Spring Framework API 提供显式声明 nullability 之外, 这些注解可以被IDE(如IDEA或Eclipse)使用,以提供有用的 与 null-safety 相关的警告,以便在运行时避免。NullPointerException

它们还用于在 Kotlin 项目中使 Spring API 为 null 安全,因为 Kotlin 原生 支持 null-safety。更多详情 可在 Kotlin 支持文档中找到。

JSR-305 元注释

Spring 注解使用 JSR 305 注解(一种休眠但广泛使用的 JSR)进行元注解。JSR-305 元注释让工具供应商 像 IDEA 或 Kotlin 一样,以通用方式提供零安全支持,而不必 对 Spring 注解的硬编码支持。

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