Spring整体架构与模块划分
核心容器(Core Container)
- spring-core
- 基础工具类:如资源加载(
Resource
接口)、反射工具(ReflectionUtils
)、类型转换(ConversionService
)。 - 核心接口:
BeanFactory
(IoC容器的基本定义)。
- 基础工具类:如资源加载(
- spring-beans
- Bean的定义与依赖管理:
BeanDefinition
(描述Bean的元数据)、BeanWrapper
(Bean属性操作)。 - Bean的实例化与生命周期管理:
AbstractAutowireCapableBeanFactory
(Bean创建的核心类)。
- Bean的定义与依赖管理:
- spring-context
- 应用上下文:
ApplicationContext
(扩展自BeanFactory
,提供国际化、事件发布、资源加载等高级功能)。 - 核心实现类:
ClassPathXmlApplicationContext
(XML配置的上下文)、AnnotationConfigApplicationContext
(注解驱动的上下文)。
- 应用上下文:
- spring-expression(SpEL):Spring表达式语言,支持在运行时查询和操作对象图,如
@Value("#{systemProperties}")
。
AOP与Instrumentation
- spring-aop:动态代理,基于JDK动态代理或CGLIB生成AOP代理对象,如
AopProxy
(代理对象生成器)、Advisor
(切面逻辑)。 - spring-aspects:集成AspectJ,支持
@AspectJ
注解风格的切面定义。 - spring-instrument:类加载器增强,用于服务器级的类植入(如Tomcat的
InstrumentableClassLoader
)。
数据访问与集成(Data Access/Integration)
- spring-jdbc:JDBC抽象层,
JdbcTemplate
简化数据库操作,避免手动处理连接和异常。 - spring-tx:事务管理,
PlatformTransactionManager
定义事务操作,支持声明式事务(@Transactional
)。 - spring-orm:ORM框架整合,对Hibernate、JPA等的支持,如
HibernateTemplate
。 - spring-oxm:对象-XML映射,支持JAXB、XStream等,用于XML与Java对象的转换。
- spring-jms:消息服务,简化JMS API的使用,如
JmsTemplate
。
Web层
- spring-web:基础Web功能,如HTTP客户端、Servlet监听器、
WebApplicationContext
(Web应用上下文)。 - spring-webmvc:MVC框架,如
DispatcherServlet
(前端控制器)、@Controller
、@RequestMapping
注解驱动开发。 - spring-webflux(Spring 5+):响应式Web支持,基于Reactor库实现非阻塞式编程模型,核心类如
WebHandler
。 - spring-websocket:WebSocket通信,支持实时双向通信,如
WebSocketHandler
。
其他模块
- spring-test:集成测试支持,
@SpringJUnitConfig
加载上下文,MockMvc
模拟HTTP请求。 - spring-messaging:消息协议抽象,支持STOMP、WebSocket子协议,用于构建消息驱动的应用。
- spring-context-support:第三方库集成,如缓存(Ehcache)、邮件(JavaMail)、调度(Quartz)。
- spring-framework-bom:依赖管理,统一管理Spring模块的版本,避免Maven/Gradle依赖冲突。
BeanFactory与ApplicationContext的核心区别
设计目标与定位
-
BeanFactory
- 定位:IoC 容器的基础接口,提供 最底层的容器功能,是 Spring 框架的基石。
- 设计目标:实现 Bean 的 定义、加载、实例化、依赖注入 等核心功能;保持轻量级,关注容器的基础职责,不集成非必要功能。
-
ApplicationContext
- 定位:
BeanFactory
的扩展接口,是 Spring 的 高级容器,面向企业级应用。 - 设计目标:在
BeanFactory
基础上,集成 事件发布、国际化、资源管理、AOP 支持 等企业级功能,提供注解驱动。
- 定位:
功能特性对比
-
BeanFactory 的核心功能
- Bean 的实例化与依赖注入:通过
getBean()
方法获取 Bean 实例;支持构造器注入(Constructor Injection)和 Setter 注入。 - Bean 生命周期管理:支持
init-method
和destroy-method
回调。 - 层级容器(Hierarchical Containers):通过
HierarchicalBeanFactory
接口支持父子容器。
- Bean 的实例化与依赖注入:通过
-
ApplicationContext 的扩展功能
-
**事件发布机制(Event Publishing)**通过
ApplicationEventPublisher
接口发布事件(如ContextRefreshedEvent
)。 -
国际化支持(MessageSource):通过
MessageSource
接口实现多语言资源加载。 -
资源访问抽象(ResourceLoader):支持统一资源定位(如
classpath:
、file:
、http:
前缀)。 -
环境配置(Environment Abstraction):管理 Profiles(
@Profile
)和属性文件(@PropertySource
)。 -
AOP 与事务集成:自动注册
AnnotationAwareAspectJAutoProxyCreator
;声明式事务的自动代理(@Transactional
)。 -
便捷的配置方式:支持 XML、Java 注解(
@Component
、@Configuration
)和 Java Config。 -
public interface ApplicationContext extends EnvironmentCapable, // 环境配置ListableBeanFactory, // 扩展 BeanFactory(支持按类型获取 Bean)HierarchicalBeanFactory, // 层级容器MessageSource, // 国际化ApplicationEventPublisher, // 事件发布ResourcePatternResolver { // 资源加载 }
-
Bean 加载机制
-
BeanFactory:延迟加载(Lazy Initialization),只有在调用
getBean()
时才会实例化 Bean。 -
ApplicationContext:预加载单例 Bean,在容器启动时(
refresh()
方法)完成所有非延迟单例 Bean 的实例化。 -
循环依赖处理:通过 三级缓存 解决循环依赖,但需要开发者手动处理
BeanPostProcessor
的依赖关系。private final Map<String, Object> singletonObjects = ...; // 一级缓存(完整 Bean) private final Map<String, Object> earlySingletonObjects = ...; // 二级缓存(早期引用) private final Map<String, ObjectFactory<?>> singletonFactories = ...; // 三级缓存(工厂对象)
核心区别
对比项 | BeanFactory | ApplicationContext |
---|---|---|
功能定位 | 基础容器,仅提供 IoC/DI 核心功能 | 高级容器,集成企业级扩展功能 |
Bean 加载 | 延迟加载(按需实例化) | 预加载单例 Bean(启动时完成) |
扩展能力 | 无事件、国际化、AOP 等支持 | 支持事件、国际化、资源抽象、AOP 等 |
配置方式 | 仅支持 XML | 支持 XML、注解、Java Config |
实际使用 | 极少直接使用 | Spring 应用的标准容器 |
资源定位与Resource体系
Resource接口与实现类
ClassPathResource
:类路径下的资源FileSystemResource
:文件系统资源UrlResource
: URL资源(HTTP、FTP等)ServletContextResource
:Web应用上下文资源ByteArrayResource
:内存字节数组资源
public interface Resource extends InputStreamSource {boolean exists(); // 资源是否存在boolean isReadable(); // 资源是否可读boolean isOpen(); // 资源是否为流形式(如网络资源)URL getURL() throws IOException;File getFile() throws IOException;String getDescription(); // 资源描述(如文件路径)
}
资源定位的核心接口
- ResourceLoader:根据路径字符串(如
classpath:app.xml
)返回对应的Resource
对象。 - ResourcePatternResolver:支持通配符(如
classpath*:config/*.xml
)匹配多个资源。 - ApplicationContext与资源加载:所有
ApplicationContext
均实现了ResourceLoader
接口,可直接调用getResource()
方法。
资源定位流程(以XML配置为例)
- 构造方法传入配置文件路径:
new ClassPathXmlApplicationContext("classpath:application.xml")
- 解析路径为Resource数组:使用
PathMatchingResourcePatternResolver
解析路径,生成Resource[]
- 加载并读取资源:
XmlBeanDefinitionReader
读取Resource
中的XML配置;解析Bean定义并注册到BeanFactory
。
BeanDefinition的加载与解析(XML、注解)
BeanDefinition的核心属性
- Bean的类名(
beanClassName
) - 作用域(
scope
,如singleton
、prototype
) - 是否延迟加载(
lazyInit
) - 初始化/销毁方法(
initMethodName
、destroyMethodName
) - 依赖关系(通过构造函数参数或属性注入)
- 工厂方法(
factoryMethodName
,用于静态工厂或实例工厂创建Bean)
XML配置的加载与解析流程
-
资源定位与读取
- 入口类:
XmlBeanDefinitionReader
(负责读取XML文件并解析为BeanDefinition)。 - 资源定位:通过
ResourceLoader
(如ClassPathResource
)加载XML文件。 - 文档解析:使用
DocumentLoader
将XML文件解析为Document
对象(基于DOM或SAX)。 - BeanDefinition解析:遍历Document中的元素(如
<bean>
标签),生成BeanDefinition。
- 入口类:
-
XML解析的核心类
- DefaultBeanDefinitionDocumentReader:遍历XML文档中的根元素(
<beans>
)及其子元素(<bean>
等)。 - BeanDefinitionParserDelegate:具体解析每个
<bean>
标签,处理属性(如id
、class
、scope
)和子元素。
- DefaultBeanDefinitionDocumentReader:遍历XML文档中的根元素(
注解配置的加载与解析流程
- 组件扫描与注解处理器
- 入口类:
ClassPathBeanDefinitionScanner
(负责扫描类路径下的注解类)。 - 核心注解:
@Component
(及其派生注解@Service
等)、@Configuration
、@Bean
、@Autowired
、@Value
- 入口类:
- 组件扫描流程
- 配置扫描路径:通过
@ComponentScan(basePackages = "com.example")
指定包路径。 - 类路径扫描:使用
ClassPathScanningCandidateComponentProvider
筛选候选类。 - 生成BeanDefinition:对带有
@Component
的类生成ScannedGenericBeanDefinition
。
- 配置扫描路径:通过
- 注解解析的核心类
- AnnotatedBeanDefinitionReader:处理
@Configuration
类中的@Bean
方法,将其转换为ConfigurationClassBeanDefinition
。 - AutowiredAnnotationBeanPostProcessor:处理
@Autowired
和@Value
注解,实现依赖注入。
- AnnotatedBeanDefinitionReader:处理
Bean的实例化过程:构造函数、工厂方法
Bean实例化整体流程
- 实例化(Instantiation):创建Bean的原始对象(通过构造函数或工厂方法)。
- 属性填充(Population):依赖注入(DI)及设置属性值。
- 初始化(Initialization):调用初始化方法(如
init-method
)及应用后置处理器。 - 销毁(Destruction)(可选):容器关闭时调用销毁方法。
实例化阶段(Instantiation)
-
目标:根据Bean定义创建Bean的原始对象。
-
默认构造函数:无参构造函数(最常见方式)。
-
静态工厂方法:通过
factory-method
指定静态方法。 -
实例工厂方法:通过
factory-bean
和factory-method
指定实例方法。 -
三级缓存机制:
-
一级缓存(singletonObjects):存放完全初始化的单例Bean。
-
二级缓存(earlySingletonObjects):存放早期暴露的Bean(未完成属性填充)。
-
三级缓存(singletonFactories):存放Bean的工厂对象,用于生成早期引用。
-
属性填充(Population)
-
目标:为Bean注入依赖的属性和值。
-
Setter注入:通过
<property>
标签或@Autowired
注解。 -
构造器注入:通过
<constructor-arg>
标签或构造函数参数上的@Autowired
。 -
自动装配(Autowiring)
-
按类型(byType):根据类型匹配候选Bean。
-
按名称(byName):根据属性名匹配Bean名称。
-
注解驱动:通过
@Autowired
、@Resource
或@Inject
实现。
-
初始化阶段(Initialization)
- 目标:执行初始化逻辑,使Bean达到可用状态。
- Aware接口回调:调用
BeanNameAware.setBeanName()
、BeanFactoryAware.setBeanFactory()
等。 - BeanPostProcessor前置处理:调用
postProcessBeforeInitialization()
(如@PostConstruct
处理)。 - 自定义初始化方法:调用
InitializingBean.afterPropertiesSet()
或XML中配置的init-method
。 - BeanPostProcessor后置处理:调用
postProcessAfterInitialization()
(如AOP代理的生成)。 - AOP代理生成:
postProcessAfterInitialization()
阶段,AbstractAutoProxyCreator
会为需要代理的Bean生成动态代理对象
销毁阶段(Destruction)
- 目标:容器关闭时释放资源。
- 实现DisposableBean接口:重写
destroy()
方法。 - XML配置
destroy-method
:指定自定义销毁方法。 - 注解
@PreDestroy
:标记销毁前执行的方法。