空安全

尽管Java不允许您通过其类型系统表达空安全性,但Spring Framework在org.springframework.lang包中提供以下注解,让您可以声明API和字段的可空性:

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

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

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

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

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

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

使用案例

除了为Spring Framework 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-based库这样的项目应该使用com.google.code.findbugs:jsr305:3.0.2compileOnly Gradle配置或Maven的provided范围,以避免编译器警告。