本文档重点介绍了 Spring Framework 作为全面的应用程序开发平台的主要特性和功能。这些特性为构建企业 Java 应用程序奠定了基础,最大限度地减少了样板代码并提供了最大的灵活性。
Spring Framework 最显著的特性是其精密的 IoC 容器,它管理着对象的生命周期和依赖关系。该容器围绕 BeanFactory 接口构建,其中 DefaultListableBeanFactory 是其主要实现。
核心 IoC 容器架构
DefaultListableBeanFactory 作为核心 Bean 注册表,实现了 ConfigurableListableBeanFactory 和 BeanDefinitionRegistry 接口。它在一个 ConcurrentHashMap<String, BeanDefinition> beanDefinitionMap 中维护 Bean,并通过 getBeanNamesForType() 和 getBeansOfType() 等方法提供类型安全的 Bean 检索。
| 容器特性 | 实现 | 关键方法 |
|---|---|---|
| Bean 注册 | BeanDefinitionRegistry | registerBeanDefinition(), removeBeanDefinition() |
| Bean 检索 | ListableBeanFactory | getBean(), getBeanNamesForType(), getBeansOfType() |
| 类型匹配 | DefaultListableBeanFactory | isTypeMatch(), getType() |
| 依赖项解析 | AutowireCapableBeanFactory | resolveDependency(), autowireBean() |
来源
Spring 的依赖注入系统使用 AutowiredAnnotationBeanPostProcessor 及相关基础设施自动解析和注入依赖。
依赖注入机制
AutowiredAnnotationBeanPostProcessor 通过实现 SmartInstantiationAwareBeanPostProcessor 接口来处理 @Autowired、@Value 和 @Inject 注解。它在 postProcessMergedBeanDefinition() 阶段处理注入元数据,并在 postProcessProperties() 中执行实际注入。
| 注入类型 | 处理器方法 | 支持的注解 |
|---|---|---|
| 构造函数 | determineCandidateConstructors() | 构造函数上的 @Autowired |
| 字段 | postProcessProperties() | @Autowired, @Value, @Inject |
| 方法 | postProcessProperties() | @Autowired, @Value, @Inject |
来源
Spring 提供了同步和响应式 HTTP 客户端,代表了不同的 Web 通信编程模型。
Web 客户端架构
RestTemplate 继承 InterceptingHttpAccessor 并实现 RestOperations,提供了一个采用模板方法模式的同步 HTTP 客户端。它维护一个 List<HttpMessageConverter<?>> messageConverters 用于请求/响应转换,并通过 ClientHttpRequestInterceptor 支持拦截器。
| RestTemplate 方法 | 目的 | 返回类型 |
|---|---|---|
getForObject() | 返回对象的 GET 请求 | <T> T |
getForEntity() | 返回 ResponseEntity 的 GET 请求 | <T> ResponseEntity<T> |
postForObject() | 返回对象的 POST 请求 | <T> T |
exchange() | 通用 HTTP 交换 | <T> ResponseEntity<T> |
execute() | 低级 HTTP 执行 | <T> T |
WebClient 通过 DefaultWebClient 实现提供响应式 HTTP 客户端。它使用流畅的 API,通过 RequestHeadersUriSpec 和 RequestBodyUriSpec 接口进行方法链式调用,返回用于响应式流的 Mono 和 Flux 类型。
| WebClient 方法 | 目的 | 返回类型 |
|---|---|---|
get(), post(), put() | HTTP 方法规范 | RequestHeadersUriSpec<?> 或 RequestBodyUriSpec |
retrieve() | 简单响应提取 | ResponseSpec |
exchangeToMono() | 高级响应处理 | <V> Mono<V> |
bodyToMono() | 提取单个响应对象 | <T> Mono<T> |
bodyToFlux() | 提取响应流 | <T> Flux<T> |
来源
Spring 通过 WebMvcConfigurationSupport 提供声明式 MVC 配置,该类为核心 MVC 组件定义了 @Bean 方法。应用程序可以扩展此 K 类或实现 WebMvcConfigurer 进行自定义。
| 配置组件 | Bean 方法 | 目的 |
|---|---|---|
| 处理器映射 | requestMappingHandlerMapping() | 将 @RequestMapping 映射到处理器 |
| 处理器适配器 | requestMappingHandlerAdapter() | 执行控制器方法 |
| 消息转换器 | getMessageConverters() | HTTP 消息转换 |
| 异常解析器 | handlerExceptionResolver() | 异常处理 |
| 视图解析器 | mvcViewResolver() | 视图解析 |
来源
Spring 的响应式编程支持围绕 WebClient 和响应式 HTTP 基础设施展开,提供带背压支持的非阻塞 I/O。
WebClient 响应式架构
WebClient 操作返回响应式类型(Mono<T>, Flux<T>),实现非阻塞组合。DefaultWebClient 实现使用 ExchangeFunction 进行请求/响应交换,并使用 ExchangeStrategies 进行消息编解码器配置。
| WebClient 组件 | 实现 | 关键方法 |
|---|---|---|
| 生成器 | DefaultWebClientBuilder | build(), baseUrl(), clientConnector() |
| 请求规范 | DefaultRequestBodyUriSpec | uri(), headers(), bodyValue() |
| 响应规范 | DefaultResponseSpec | bodyToMono(), toEntity(), onStatus() |
| 交换 | ExchangeFunction | exchange() |
| 响应 | DefaultClientResponse | statusCode(), bodyToMono(), bodyToFlux() |
WebFluxConfigurationSupport 为响应式 Web 应用程序提供声明式配置,与 Spring MVC 类似,但针对响应式流进行了优化。
| 配置 Bean | 方法 | 目的 |
|---|---|---|
| 处理器映射 | routerFunctionMapping() | 函数式路由 |
| 处理器适配器 | handlerAdapter() | 响应式处理器执行 |
| 结果处理器 | responseEntityResultHandler() | 响应处理 |
| 异常处理器 | responseStatusExceptionHandler() | 响应式异常处理 |
来源
Spring 的注解支持通过专门的 BeanPostProcessor 实现来处理 Bean 生命周期中的注解,从而实现声明式编程。
注解处理流程
AutowiredAnnotationBeanPostProcessor 默认维护一个包含 @Autowired、@Value 和 @Inject 的 Set<Class<? extends Annotation>> autowiredAnnotationTypes。它实现了关键的生命周期方法
| 生命周期方法 | 目的 | 注解支持 |
|---|---|---|
determineCandidateConstructors() | 构造函数注入 | 构造函数上的 @Autowired |
postProcessMergedBeanDefinition() | 缓存注入元数据 | 所有支持的注解 |
postProcessProperties() | 执行字段/方法注入 | @Autowired, @Value, @Inject |
Spring 提供了 BeanUtils 用于反射式 Bean 操作,包括支持带可选参数和默认值的构造函数注入,尤其适用于 Kotlin 类。
| BeanUtils 方法 | 目的 | Kotlin 支持 |
|---|---|---|
instantiateClass() | Bean 实例化 | 带默认值的主构造函数 |
findPrimaryConstructor() | 构造函数解析 | Kotlin 主构造函数 |
copyProperties() | 属性复制 | Bean 属性映射 |
来源
Spring Framework 包含许多用于企业应用程序开发的高级特性。
Spring 提供了一个精密的类型转换系统,用于在不同数据类型之间进行转换
来源
Spring 提供全面的国际化支持
来源
Spring 提供资源访问抽象
来源
Spring Framework 为企业 Java 应用程序开发提供了一套全面的特性
该框架的模块化架构允许开发人员只使用他们需要的部分,而其基于注解的配置减少了样板代码并提高了开发人员的生产力。