空安全

虽然 Java 不允许您使用其类型系统表达空安全性,但 Spring 框架在org.springframework.lang包中提供了以下注解,以便您可以声明 API 和字段的可空性。

  • @Nullable:用于指示特定参数、返回值或字段可以为null的注解。

  • @NonNull:用于指示特定参数、返回值或字段不能为null的注解(在分别应用@NonNullApi@NonNullFields的参数、返回值和字段上不需要)。

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

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

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

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

用例

除了为 Spring 框架 API 可空性提供显式声明外,这些注解还可以被 IDE(如 IDEA 或 Eclipse)用来提供与空安全性相关的有用警告,以避免在运行时出现NullPointerException

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

JSR-305 元注解

Spring 注解使用JSR 305注解(一个处于休眠状态但广泛使用的 JSR)进行元注解。JSR-305 元注解允许 IDEA 或 Kotlin 等工具供应商以通用方式提供空安全性支持,而无需硬编码对 Spring 注解的支持。

为了利用 Spring 的空安全 API,无需也不建议将 JSR-305 依赖项添加到项目类路径中。只有使用代码库中空安全性注解的基于 Spring 的库等项目才应添加com.google.code.findbugs:jsr305:3.0.2,并使用compileOnly Gradle 配置或 Maven 的provided范围,以避免编译器警告。