spring之IOC的主干流程是什么

发布时间:2021-10-15 16:25:58 作者:iii
来源:亿速云 阅读:156
# 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 IOC容器体系

Spring提供了两种主要容器实现: 1. BeanFactory(基础容器) - 最简单的容器实现 - 延迟加载机制(Lazy Loading) - 示例:XmlBeanFactory

  1. ApplicationContext(高级容器)
    • 扩展了BeanFactory功能
    • 提供事件发布、国际化等企业级特性
    • 常用实现:
      • ClassPathXmlApplicationContext
      • AnnotationConfigApplicationContext

类继承关系图示:

BeanFactory
↑
ListableBeanFactory
↑
ApplicationContext
↑
ConfigurableApplicationContext

IOC主干流程解析

3.1 资源定位

容器启动的第一步是定位配置文件资源:

  1. XML配置方式: “`java // 类路径资源加载 Resource resource = new ClassPathResource(“applicationContext.xml”);

// 文件系统资源加载 Resource resource = new FileSystemResource(“/config/applicationContext.xml”);


2. **注解配置方式**:
   ```java
   // 基于Java配置类的加载方式
   ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

Spring通过ResourceLoader体系实现统一的资源访问抽象: - ClassPathResource - FileSystemResource - UrlResource - ByteArrayResource

3.2 BeanDefinition加载与解析

将资源配置转换为容器内部的BeanDefinition对象:

  1. XML解析流程

    • 使用DocumentLoader将XML转换为DOM树
    • BeanDefinitionDocumentReader解析DOM元素
    • 默认使用DefaultBeanDefinitionDocumentReader
  2. 注解解析流程

    • ConfigurationClassPostProcessor处理配置类
    • 通过ClassPathBeanDefinitionScanner扫描组件

关键数据结构:

public interface BeanDefinition {
    String getBeanClassName();
    String getScope();
    boolean isLazyInit();
    // 其他元数据访问方法...
}

3.3 BeanDefinition注册

解析后的BeanDefinition需要注册到容器中:

  1. 注册中心:DefaultListableBeanFactory维护的beanDefinitionMap

    private final Map<String, BeanDefinition> beanDefinitionMap = 
       new ConcurrentHashMap<>(256);
    
  2. 注册过程:

    • 检查beanName唯一性
    • 处理别名注册
    • 将BeanDefinition存入map

3.4 依赖注入

容器实例化并装配bean的时机:

  1. 预实例化单例bean(默认行为):

    • 在容器初始化阶段完成
    • 通过getBean()触发实例化
  2. 延迟初始化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();
}

Bean实例化核心流程

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;
}

设计模式应用

  1. 工厂模式

    • BeanFactory作为基础容器接口
    • 各种ApplicationContext实现作为具体工厂
  2. 模板方法模式

    • AbstractApplicationContext.refresh()定义流程骨架
    • 子类实现特定步骤
  3. 策略模式

    • 不同的Resource实现对应不同资源访问策略
    • 多种InstantiationStrategy实现
  4. 观察者模式

    • 通过ApplicationEvent和ApplicationListener实现事件机制

总结

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. 添加常见问题排查章节 需要进一步扩展可告知具体方向。

推荐阅读:
  1. Spring之IOC
  2. Spring中的IOC是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring ioc

上一篇:面向初学者的免费软件开发资源有哪些

下一篇:分析一个Node进程的死亡与善后

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》