空安全

尽管 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 范围,以避免编译器警告。