Spring IoC容器的设计与实现
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:标记销毁前执行的方法。
浙公网安备 33010602011771号