菜单

架构概述

相关源文件

Spring 框架围绕模块化架构构建,为企业级 Java 应用提供全面的基础设施。其核心是控制反转(IoC)容器和依赖注入(DI)系统,但该框架的功能远不止于此,还包括 Web 技术、数据访问、测试支持等。

本文档提供了 Spring 模块化架构的高级视图,展示了主要系统如何相互作用和依赖。该架构围绕分层依赖关系设计,核心工具位于基础层,IoC 容器位于中间层,而 Spring MVC 和 WebFlux 等专用框架则位于顶层。

整体框架架构

Spring 框架被组织成不同的模块,这些模块在分层架构中相互构建。该框架可以通过几个主要的系统类别来理解。

框架模块和依赖

来源

系统依赖和分层

该框架遵循严格的依赖层次结构,其中高级模块依赖于低级模块

模块主要职责
基础spring-core, spring-beans, spring-expression核心工具、IoC 容器、表达式语言
上下文spring-context, spring-aop应用上下文、配置处理、AOP
Webspring-web, spring-webmvc, spring-webfluxHTTP 抽象、Servlet/响应式 Web 框架
数据spring-jdbc, spring-orm, spring-tx数据访问、ORM 集成、事务管理
集成spring-test, spring-messaging测试支持、消息抽象

来源

核心容器架构

Spring 的核心容器围绕模块化架构构建,职责明确。该容器通过工厂、注册表和后处理器的分层系统来管理 Bean 的生命周期并处理依赖注入。

来源

关键组件

  1. BeanFactory 层次结构:

    • BeanFactory:提供基本 Bean 检索功能的核心接口
    • DefaultListableBeanFactory:存储 Bean 定义的中央注册表实现
    • AbstractAutowireCapableBeanFactory:添加了用于依赖注入的自动装配功能
    • AbstractBeanFactory:提供通用 Bean 工厂特性的基本实现
  2. Bean 定义系统:

    • BeanDefinition:表示带有配置元数据的 Bean 定义的接口
    • RootBeanDefinition:运行时具有完整配置的合并 Bean 定义
    • GenericBeanDefinition:可以有父定义的标准 Bean 定义
    • ChildBeanDefinition:从另一个定义继承的 Bean 定义
  3. 后处理器:

    • BeanPostProcessor:在 Bean 实例化后但在初始化前进行自定义的接口
    • BeanFactoryPostProcessor:用于自定义 Bean 工厂配置元数据的接口
    • BeanDefinitionRegistryPostProcessor:用于修改 Bean 定义注册表的接口

来源

Bean 生命周期和依赖注入

Spring 容器管理 Bean 从实例化到销毁的完整生命周期,并提供了各种扩展点用于自定义。

来源

依赖注入机制

Spring 支持不同类型的依赖注入

  1. 构造器注入:

    • ConstructorResolver 在 Bean 创建期间处理构造器参数的解析
    • 按构造器自动装配会查找具有最多可满足依赖项的构造器
    • @Autowired 可用于标记要使用的特定构造器
  2. 字段注入:

    • AutowiredAnnotationBeanPostProcessor 检测使用 @Autowired 注解的字段并注入依赖
    • 在 Bean 实例化后但在初始化前应用
  3. 方法注入:

    • Setter 方法或任意方法都可以使用 @Autowired 进行依赖注入
    • 可用于可选依赖项或可能更改的依赖项

来源

配置系统

Spring 的配置系统基于 @Configuration 类的概念。这些类被处理以提取 Bean 定义并将其注册到容器中。

来源

主要配置组件

  1. ConfigurationClassPostProcessor:

    • 注册为一个 BeanDefinitionRegistryPostProcessor
    • 扫描 @Configuration 类并开始配置处理
  2. ConfigurationClassParser:

    • 解析 @Configuration 类并构建配置模型
    • 处理诸如 @Import@ComponentScan@PropertySource 等注解
    • 构建一组 ConfigurationClass 实例
  3. ConfigurationClassBeanDefinitionReader:

    • 从解析的配置类中读取 Bean 定义
    • 处理 @Bean 方法并将 Bean 定义注册到容器中
  4. ComponentScanAnnotationParser:

    • 处理由 @ComponentScan 注解指定的组件扫描
    • 发现并注册注解类的 Bean 定义

来源

应用程序上下文

应用上下文作为一个高级容器,扩展了 BeanFactory 的基本功能。它提供了额外的功能,如应用事件传播、资源加载和国际化支持。

来源

关键应用上下文组件

  1. GenericApplicationContext:

    • ApplicationContext 的基本实现,它委托给 DefaultListableBeanFactory
    • 允许通过单个内部 Bean 工厂编程注册 Bean 定义
  2. AnnotationConfigApplicationContext:

    • GenericApplicationContext 的专门化实现,用于基于注解的配置
    • 使用 AnnotatedBeanDefinitionReader 来处理注解类
    • 使用 ClassPathBeanDefinitionScanner 进行组件扫描
  3. 应用上下文刷新生命周期:

    • 初始化环境和属性源
    • 验证所需的属性
    • 处理所有 Bean 工厂后处理器
    • 注册 Bean 后处理器
    • 初始化消息源、事件多播器和其他特殊 Bean
    • 实例化所有剩余的单例 Bean
    • 发布相应的事件

来源

自动装配和依赖解析

Spring 的依赖解析系统非常复杂,支持按类型、按名称以及通过限定符进行自动装配。

来源

关键自动装配组件

  1. AutowiredAnnotationBeanPostProcessor:

    • 处理 @Autowired@Value 注解(以及 JSR-330 的 @Inject 注解,如果可用)
    • 为每个要处理的 Bean 创建 InjectionMetadata 实例
    • 在 Bean 填充阶段注入依赖
  2. DependencyDescriptor:

    • 描述要注入的特定依赖项
    • 包含关于字段或方法参数的元数据
    • 包括必需状态、Bean 名称等信息
  3. AutowireCandidateResolver:

    • 确定一个 Bean 是否有资格自动装配到特定依赖项中
    • QualifierAnnotationAutowireCandidateResolver 处理限定符注解
    • 通过 GenericTypeAwareAutowireCandidateResolver 支持泛型匹配
  4. ObjectProvider:

    • BeanFactory 的增强版本,专门用于依赖项检索
    • 支持带有诸如 getIfAvailable() 等方法的可选依赖项
    • 通过 stream() 为 Bean 集合提供流式处理能力

来源

Bean 定义和注册

Spring 中的 Bean 定义系统旨在捕获创建和配置 Bean 所需的所有元数据。

来源

关键 Bean 定义组件

  1. BeanDefinition 类型:

    • AbstractBeanDefinition:具有通用属性的 Bean 定义基类
    • RootBeanDefinition:表示运行时合并的 Bean 定义
    • GenericBeanDefinition:大多数情况下的标准 Bean 定义
    • ChildBeanDefinition:从另一个定义继承的 Bean 定义
  2. Bean 定义属性:

    • 创建 Bean 的类或工厂方法
    • 作用域(单例、原型等)
    • 初始化和销毁方法
    • 依赖项(自动装配模式、depends-on 等)
    • 属性值和构造器参数
  3. Bean 名称生成:

    • AnnotationBeanNameGenerator 根据注解或类名确定名称
    • FullyQualifiedAnnotationBeanNameGenerator 使用完全限定类名
  4. Bean 定义注册:

    • BeanDefinitionRegistry 用于注册 Bean 定义的接口
    • DefaultListableBeanFactory 实现此接口
    • Bean 定义持有者将定义与其名称和别名结合起来

来源

总结

Spring 框架的核心容器架构为 Bean 管理和依赖注入提供了复杂的系统。关键组件包括

  1. BeanFactory 系统:以 DefaultListableBeanFactory 为中心,它是 Bean 定义的中央注册表,并管理 Bean 的创建和生命周期。

  2. Bean 定义系统:通过各种 BeanDefinition 实现来表示配置元数据,捕获创建和配置 Bean 所需的所有信息。

  3. 依赖注入系统:通过后处理器(特别是 AutowiredAnnotationBeanPostProcessor)和解析器(如 QualifierAnnotationAutowireCandidateResolver)的组合来处理依赖的自动装配。

  4. 配置系统:处理 @Configuration 类,通过诸如 ConfigurationClassPostProcessorConfigurationClassParser 等组件,来提取和注册 Bean 定义。

  5. 应用上下文:提供一个更高级别的容器,其功能超越了基本的 BeanFactory 功能,并有多种实现,如 GenericApplicationContextAnnotationConfigApplicationContext

这种架构使 Spring 能够提供一个强大而灵活的容器系统,支持各种配置方法(注解、XML、Java 配置)、复杂的依赖注入以及通过后处理器和其他扩展点进行广泛的自定义。

来源