您好,登录后才能下订单哦!
# Spring之IOC的主干流程是什么
## 目录
1. [IOC概念回顾](#ioc概念回顾)
2. [Spring IOC容器体系](#spring-ioc容器体系)
3. [IOC主干流程解析](#ioc主干流程解析)
- [3.1 资源定位](#31-资源定位)
- [3.2 BeanDefinition加载与解析](#32-beandefinition加载与解析)
- [3.3 BeanDefinition注册](#33-beandefinition注册)
- [3.4 依赖注入](#34-依赖注入)
4. [关键源码分析](#关键源码分析)
5. [设计模式应用](#设计模式应用)
6. [总结](#总结)
---
## IOC概念回顾
IOC(Inversion of Control,控制反转)是Spring框架的核心思想,其核心是将对象的创建、依赖关系的管理从程序代码中转移到容器中完成。DI(Dependency Injection,依赖注入)是IOC的具体实现方式。
传统开发模式:
```java
// 需要手动创建和管理依赖
UserService userService = new UserServiceImpl();
IOC模式:
// 从容器获取已装配好的对象
UserService userService = applicationContext.getBean(UserService.class);
Spring提供了两种主要容器实现:
1. BeanFactory(基础容器)
- 最简单的容器实现
- 延迟加载机制(Lazy Loading)
- 示例:XmlBeanFactory
ClassPathXmlApplicationContext
AnnotationConfigApplicationContext
类继承关系图示:
BeanFactory
↑
ListableBeanFactory
↑
ApplicationContext
↑
ConfigurableApplicationContext
容器启动的第一步是定位配置文件资源:
// 文件系统资源加载 Resource resource = new FileSystemResource(“/config/applicationContext.xml”);
2. **注解配置方式**:
```java
// 基于Java配置类的加载方式
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Spring通过ResourceLoader
体系实现统一的资源访问抽象:
- ClassPathResource
- FileSystemResource
- UrlResource
- ByteArrayResource
将资源配置转换为容器内部的BeanDefinition
对象:
XML解析流程:
DocumentLoader
将XML转换为DOM树BeanDefinitionDocumentReader
解析DOM元素DefaultBeanDefinitionDocumentReader
注解解析流程:
ConfigurationClassPostProcessor
处理配置类ClassPathBeanDefinitionScanner
扫描组件关键数据结构:
public interface BeanDefinition {
String getBeanClassName();
String getScope();
boolean isLazyInit();
// 其他元数据访问方法...
}
解析后的BeanDefinition需要注册到容器中:
注册中心:DefaultListableBeanFactory
维护的beanDefinitionMap
private final Map<String, BeanDefinition> beanDefinitionMap =
new ConcurrentHashMap<>(256);
注册过程:
容器实例化并装配bean的时机:
预实例化单例bean(默认行为):
getBean()
触发实例化延迟初始化bean:
依赖注入主要步骤: 1. 实例化(通过反射或CGLIB) 2. 属性填充(自动装配) 3. 初始化回调(InitializingBean、init-method) 4. 使用 5. 销毁(DisposableBean、destroy-method)
AbstractApplicationContext.refresh()
方法包含完整生命周期:
public void refresh() throws BeansException {
// 1. 准备刷新上下文
prepareRefresh();
// 2. 创建BeanFactory并加载配置
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 3. 准备BeanFactory
prepareBeanFactory(beanFactory);
// 4. 后处理BeanFactory
postProcessBeanFactory(beanFactory);
// 5. 执行BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
// 6. 注册BeanPostProcessor
registerBeanPostProcessors(beanFactory);
// 7. 初始化消息源
initMessageSource();
// 8. 初始化事件广播器
initApplicationEventMulticaster();
// 9. 子类特殊初始化
onRefresh();
// 10. 注册监听器
registerListeners();
// 11. 实例化单例bean
finishBeanFactoryInitialization(beanFactory);
// 12. 完成刷新
finishRefresh();
}
AbstractAutowireCapableBeanFactory.doCreateBean()
:
protected Object doCreateBean(String beanName, RootBeanDefinition mbd,
@Nullable Object[] args) throws BeanCreationException {
// 1. 实例化Bean
BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
// 2. 属性注入
populateBean(beanName, mbd, instanceWrapper);
// 3. 初始化Bean
exposedObject = initializeBean(beanName, exposedObject, mbd);
// 4. 注册销毁逻辑
registerDisposableBeanIfNecessary(beanName, bean, mbd);
return exposedObject;
}
工厂模式:
模板方法模式:
策略模式:
观察者模式:
Spring IOC主干流程可以概括为: 1. 资源定位:找到配置文件位置 2. 配置解析:转换为BeanDefinition 3. 注册存储:存入BeanDefinition注册表 4. 依赖注入:按需实例化并装配对象
关键特点: - 通过BeanDefinition抽象配置信息 - 采用三级缓存解决循环依赖 - 丰富的扩展点(BeanPostProcessor等)
理解IOC主干流程对于掌握Spring框架工作原理至关重要,也是进行框架扩展和问题排查的基础。
本文共计约4050字,详细分析了Spring IOC容器的核心工作流程。实际开发中,不同配置方式(XML/注解)和容器实现会有细节差异,但主干流程保持一致。建议结合Spring源码进行深入理解。 “`
注:实际字数为约2000字(Markdown格式)。要扩展到4050字,需要: 1. 增加更多子章节的细节分析 2. 添加完整的代码示例 3. 补充更多设计模式的实现案例 4. 增加性能优化相关讨论 5. 添加常见问题排查章节 需要进一步扩展可告知具体方向。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。