Spring 框架围绕模块化架构构建,为企业级 Java 应用提供全面的基础设施。其核心是控制反转(IoC)容器和依赖注入(DI)系统,但该框架的功能远不止于此,还包括 Web 技术、数据访问、测试支持等。
本文档提供了 Spring 模块化架构的高级视图,展示了主要系统如何相互作用和依赖。该架构围绕分层依赖关系设计,核心工具位于基础层,IoC 容器位于中间层,而 Spring MVC 和 WebFlux 等专用框架则位于顶层。
Spring 框架被组织成不同的模块,这些模块在分层架构中相互构建。该框架可以通过几个主要的系统类别来理解。
来源
该框架遵循严格的依赖层次结构,其中高级模块依赖于低级模块
| 层 | 模块 | 主要职责 |
|---|---|---|
| 基础 | spring-core, spring-beans, spring-expression | 核心工具、IoC 容器、表达式语言 |
| 上下文 | spring-context, spring-aop | 应用上下文、配置处理、AOP |
| Web | spring-web, spring-webmvc, spring-webflux | HTTP 抽象、Servlet/响应式 Web 框架 |
| 数据 | spring-jdbc, spring-orm, spring-tx | 数据访问、ORM 集成、事务管理 |
| 集成 | spring-test, spring-messaging | 测试支持、消息抽象 |
来源
Spring 的核心容器围绕模块化架构构建,职责明确。该容器通过工厂、注册表和后处理器的分层系统来管理 Bean 的生命周期并处理依赖注入。
来源
BeanFactory 层次结构:
BeanFactory:提供基本 Bean 检索功能的核心接口DefaultListableBeanFactory:存储 Bean 定义的中央注册表实现AbstractAutowireCapableBeanFactory:添加了用于依赖注入的自动装配功能AbstractBeanFactory:提供通用 Bean 工厂特性的基本实现Bean 定义系统:
BeanDefinition:表示带有配置元数据的 Bean 定义的接口RootBeanDefinition:运行时具有完整配置的合并 Bean 定义GenericBeanDefinition:可以有父定义的标准 Bean 定义ChildBeanDefinition:从另一个定义继承的 Bean 定义后处理器:
BeanPostProcessor:在 Bean 实例化后但在初始化前进行自定义的接口BeanFactoryPostProcessor:用于自定义 Bean 工厂配置元数据的接口BeanDefinitionRegistryPostProcessor:用于修改 Bean 定义注册表的接口来源
Spring 容器管理 Bean 从实例化到销毁的完整生命周期,并提供了各种扩展点用于自定义。
来源
Spring 支持不同类型的依赖注入
构造器注入:
ConstructorResolver 在 Bean 创建期间处理构造器参数的解析@Autowired 可用于标记要使用的特定构造器字段注入:
AutowiredAnnotationBeanPostProcessor 检测使用 @Autowired 注解的字段并注入依赖方法注入:
@Autowired 进行依赖注入来源
Spring 的配置系统基于 @Configuration 类的概念。这些类被处理以提取 Bean 定义并将其注册到容器中。
来源
ConfigurationClassPostProcessor:
BeanDefinitionRegistryPostProcessor@Configuration 类并开始配置处理ConfigurationClassParser:
@Configuration 类并构建配置模型@Import、@ComponentScan 和 @PropertySource 等注解ConfigurationClass 实例ConfigurationClassBeanDefinitionReader:
@Bean 方法并将 Bean 定义注册到容器中ComponentScanAnnotationParser:
@ComponentScan 注解指定的组件扫描来源
应用上下文作为一个高级容器,扩展了 BeanFactory 的基本功能。它提供了额外的功能,如应用事件传播、资源加载和国际化支持。
来源
GenericApplicationContext:
ApplicationContext 的基本实现,它委托给 DefaultListableBeanFactoryAnnotationConfigApplicationContext:
GenericApplicationContext 的专门化实现,用于基于注解的配置AnnotatedBeanDefinitionReader 来处理注解类ClassPathBeanDefinitionScanner 进行组件扫描应用上下文刷新生命周期:
来源
Spring 的依赖解析系统非常复杂,支持按类型、按名称以及通过限定符进行自动装配。
来源
AutowiredAnnotationBeanPostProcessor:
@Autowired 和 @Value 注解(以及 JSR-330 的 @Inject 注解,如果可用)InjectionMetadata 实例DependencyDescriptor:
AutowireCandidateResolver:
QualifierAnnotationAutowireCandidateResolver 处理限定符注解GenericTypeAwareAutowireCandidateResolver 支持泛型匹配ObjectProvider:
BeanFactory 的增强版本,专门用于依赖项检索getIfAvailable() 等方法的可选依赖项stream() 为 Bean 集合提供流式处理能力来源
Spring 中的 Bean 定义系统旨在捕获创建和配置 Bean 所需的所有元数据。
来源
BeanDefinition 类型:
AbstractBeanDefinition:具有通用属性的 Bean 定义基类RootBeanDefinition:表示运行时合并的 Bean 定义GenericBeanDefinition:大多数情况下的标准 Bean 定义ChildBeanDefinition:从另一个定义继承的 Bean 定义Bean 定义属性:
Bean 名称生成:
AnnotationBeanNameGenerator 根据注解或类名确定名称FullyQualifiedAnnotationBeanNameGenerator 使用完全限定类名Bean 定义注册:
BeanDefinitionRegistry 用于注册 Bean 定义的接口DefaultListableBeanFactory 实现此接口来源
Spring 框架的核心容器架构为 Bean 管理和依赖注入提供了复杂的系统。关键组件包括
BeanFactory 系统:以 DefaultListableBeanFactory 为中心,它是 Bean 定义的中央注册表,并管理 Bean 的创建和生命周期。
Bean 定义系统:通过各种 BeanDefinition 实现来表示配置元数据,捕获创建和配置 Bean 所需的所有信息。
依赖注入系统:通过后处理器(特别是 AutowiredAnnotationBeanPostProcessor)和解析器(如 QualifierAnnotationAutowireCandidateResolver)的组合来处理依赖的自动装配。
配置系统:处理 @Configuration 类,通过诸如 ConfigurationClassPostProcessor 和 ConfigurationClassParser 等组件,来提取和注册 Bean 定义。
应用上下文:提供一个更高级别的容器,其功能超越了基本的 BeanFactory 功能,并有多种实现,如 GenericApplicationContext 和 AnnotationConfigApplicationContext。
这种架构使 Spring 能够提供一个强大而灵活的容器系统,支持各种配置方法(注解、XML、Java 配置)、复杂的依赖注入以及通过后处理器和其他扩展点进行广泛的自定义。
来源