本页面介绍了 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 作为 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(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 接口定义了核心转换契约,包含多个重载方法
每个变体都为类型感知转换提供了递增的上下文级别 spring-beans/src/main/java/org/springframework/beans/TypeConverter.java42-115
FormattingConversionService 扩展了基本转换系统,增加了区域设置感知的格式化功能。
该服务使用 GenericTypeResolver.resolveTypeArgument() 自动从 Formatter 实现中检测字段类型 spring-context/src/main/java/org/springframework/format/support/FormattingConversionService.java114-127
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
来源: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 定义进行匹配提供了基础。