My logo
Published on

Spring 常用组件源码分析

Spring 常用组件源码分析

1. Spring 类型转换机制

Spring 提供了强大的类型转换机制,用于处理各种数据类型之间的转换。本节将深入分析 Spring 的类型转换实现原理。

1.1 类型转换体系

Spring 3.0 引入了全新的类型转换机制,提供了三种类型转换器:

  • Converter: 处理 1:1 的类型转换
  • ConverterFactory: 处理 1:N 的类型转换
  • GenericConverter: 处理 N:N 的类型转换

特别强调:转换器的注册顺序非常重要,这决定了通用转换器的匹配结果(谁在前,优先匹配谁)。

1.2 统一类型转换服务 (ConversionService)

Spring 的类型转换服务由以下几个核心组件组成:

核心接口/类

  • ConverterRegistry: 转换器注册中心,负责转换器的注册和删除
  • ConversionService: 统一的类型转换服务,面向开发者的门面接口
  • ConfigurableConversionService: ConverterRegistry 和 ConversionService 的组合接口
  • GenericConversionService: 实现了注册管理和转换服务的核心功能
  • DefaultConversionService: 继承自 GenericConversionService,注册了默认转换器

类型转换服务架构

类型转换服务架构

1.3 Spring 日期格式化

Spring 的日期格式化功能基于 JDK 的 java.text.DateFormat(实际为 SimpleDateFormat)实现。

日期格式化流程

日期格式化流程

JSR 310 日期时间类型

Java 8 引入了一套全新的时间日期 API,位于 java.time 包中。这些类都是不可变且线程安全的:

  • Instant: 时间戳
  • LocalDate: 不含具体时间的日期(如:2020-12-12)
  • LocalTime: 不含日期的时间(如:18:00:00)
  • LocalDateTime: 包含日期和时间,无时区信息
  • ZonedDateTime: 包含时区的完整日期时间
  • Timezone: 时区(使用 ZoneId 表示)

辅助类:

  • Year
  • Month
  • YearMonth
  • MonthDay
  • Duration
  • Period

建议:对于新项目或新代码,建议完全禁用 java.util.Date 类型,使用 JSR 310 的新日期时间 API。

日期格式化流程

1.4 实际应用场景

场景一:类型转换增强

利用 ConversionService 提供的强大能力,可以在基于 Spring/Spring Boot 的二次开发中提高系统的通用性和容错性。

例如:当方法入参是 Stream 类型时,可以同时支持:

  • Stream 类型
  • Collection 类型
  • 数组类型

类型转换示例

场景二:Optional 类型支持

/**
 * 在 Controller 中处理可选参数
 * 方式一:@RequestParam(required = false) Long id
 * 方式二:@RequestParam Optional<Long> id
 */
@Test
public void testOptionalConversion() {
    System.out.println("----------------ObjectToOptionalConverter---------------");
    ConversionService conversionService = new DefaultConversionService();
    Optional<Integer> result = conversionService.convert(Arrays.asList(2), Optional.class);
    System.out.println(result);
}

1.5 最佳实践

  1. 注册顺序

    • 转换器的注册顺序很重要
    • 遵循"先注册,先服务"的原则
  2. 默认转换器

    • Spring 默认注册了大量内建转换器
    • 支持 String/数字类型转换
    • 支持集合类型转换
    • 解决协议层面的大部分转换问题
  3. 常见应用场景

    • Controller 层:JSON 字符串自动转换为数字类型、集合类型等
    • @Value 注入:String 类型自动转换为数字、集合类型等
  4. 自定义转换

    • 复杂的对象 -> 对象类型转换需要自定义转换器
    • 遵循标准写法完成转换

总结:Spring 的 ConversionService 是一个专注于类型转换服务的实用 API,特别适合基于 Spring 的二次开发场景。