菜单

类型系统和转换

相关源文件

本页面介绍了 Spring 的类型系统和转换机制,它们提供了对 Java 泛型和类型安全转换操作的复杂处理。该系统使 Spring 能够处理复杂的泛型类型层次结构、执行类型感知转换并与基于注解的格式化集成。

有关 IoC 容器和依赖注入的信息,请参阅Bean 和依赖注入。有关注解处理的详细信息,请参阅注解处理

目的与范围

Spring 的类型系统提供了一种统一的方法来

  • 在运行时解析复杂的泛型类型信息
  • 在不同对象类型之间执行类型安全转换
  • 将类型信息与注解元数据集成,以进行上下文感知处理
  • 支持框架的依赖注入和数据绑定功能

该系统由三个主要组件组成:用于类型解析的 ResolvableType、用于转换上下文的 TypeDescriptor,以及用于向后兼容和特定解析场景的 GenericTypeResolver

核心类型系统架构

来源:spring-core/src/main/java/org/springframework/core/ResolvableType.java1-1500 spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java1-700 spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java1-315

ResolvableType:核心类型解析

ResolvableType 作为 Spring 类型系统的基础,封装了 Java 的 Type 接口并提供了增强的导航和解析功能。

主要功能

功能方法描述
类型导航getSuperType(), getInterfaces()导航类型层次结构
泛型访问getGeneric(int...), getGenerics()访问参数化类型参数
类型解析resolve(), resolveGeneric(int...)解析为具体的 Class 实例
类型检查isAssignableFrom(), isArray(), isCollection()类型兼容性检查
专项as(Class), asCollection(), asMap()转换为特定类型视图

工厂方法

来源:spring-core/src/main/java/org/springframework/core/ResolvableType.java1270-1400

该类通过 ConcurrentReferenceHashMap 提供广泛的缓存,以优化重复类型解析的性能 spring-core/src/main/java/org/springframework/core/ResolvableType.java98-99

TypeDescriptor:转换上下文

TypeDescriptor 在转换操作期间提供有关类型的上下文信息,将类型信息与注解元数据结合起来。

构造模式

构造函数用例示例
TypeDescriptor(MethodParameter)方法参数/返回值参数转换
TypeDescriptor(Field)字段访问属性绑定
TypeDescriptor(Property)Bean 属性数据绑定
TypeDescriptor(ResolvableType, Class, Annotation[])自定义上下文框架集成

类型分类方法

该类为不同类型类别提供了专门的方法

  • 集合isCollection(), getElementTypeDescriptor(), elementTypeDescriptor(Object)
  • 数组isArray(), getElementTypeDescriptor()
  • 映射isMap(), getMapKeyTypeDescriptor(), getMapValueTypeDescriptor()
  • 注解hasAnnotation(Class), getAnnotation(Class), getAnnotations()

来源:spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java87-132 spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java348-475

类型转换基础设施

来源:spring-beans/src/main/java/org/springframework/beans/TypeConverter.java1-117 spring-beans/src/main/java/org/springframework/beans/TypeConverterSupport.java1-86 spring-context/src/main/java/org/springframework/format/support/FormattingConversionService.java1-400

TypeConverter 接口

TypeConverter 接口定义了核心转换契约,包含多个重载方法

每个变体都为类型感知转换提供了递增的上下文级别 spring-beans/src/main/java/org/springframework/beans/TypeConverter.java42-115

格式化集成

FormattingConversionService 扩展了基本转换系统,增加了区域设置感知的格式化功能。

转换器注册

来源:spring-context/src/main/java/org/springframework/format/support/FormattingConversionService.java70-111

该服务使用 GenericTypeResolver.resolveTypeArgument() 自动从 Formatter 实现中检测字段类型 spring-context/src/main/java/org/springframework/format/support/FormattingConversionService.java114-127

GenericTypeResolver:遗留支持

GenericTypeResolver 提供了用于解析泛型类型的实用方法,主要用于向后兼容和特定解析场景。

核心解析方法

方法目的使用示例
resolveTypeArgument(Class, Class)单个类型参数解析List<String>String
resolveTypeArguments(Class, Class)多个类型参数Map<K,V>[K, V]
resolveReturnType(Method, Class)上下文中方法返回类型泛型方法解析
resolveType(Type, Class)带上下文的类型解析变量替换

解析器维护了一个 TypeVariable 映射的缓存,用于性能优化 spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java49-50 spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java257-265

与 Bean 处理的集成

来源:spring-beans/src/main/java/org/springframework/beans/TypeConverterSupport.java42-84 spring-context/src/test/java/org/springframework/context/annotation/Spr16179Tests.java32-42

类型系统与 Spring 的依赖注入机制深度集成,实现了泛型类型和集合依赖的类型安全自动装配。ResolvableType 类为基于完整的泛型类型信息将注入点与 Bean 定义进行匹配提供了基础。