[Spring]-容器内部工作机制

Spring容器启动流程:

  1. 初始化BeanFactory
    根据配置文件实例化BeanFactory,在obtainFreshBeanFactory()方法中首先调用refreshBeanFactory()方法刷新BeanFactory,然后调用getBeanFactory()方法获取BeanFactory,这两个方法都是由具体子类实现的。
    同时,spring将配置文件信息装入容器的Bean定义注册表(BeanDefinationRegistry)中,但此时Bean尚未初始化。
  2. 调用工厂后处理器:
    根据反射机制从BeanDefinationRegistry中找出所有实现了BeanFactoryPostProcessor接口的Bean,并调用其postProcessBeanFactory()接口方法。
  3. 注册Bean后处理器:
    根据反射机制从BeanDefinationRegistry中找出所有实现了BeanPostProcessor接口的Bean,并将他们注册到容器Bean后处理器的注册表中。
  4. 初始化消息源:初始化容器的国际化消息资源
  5. 初始化应用上下文事件广播器
  6. 初始化其他特殊的Bean:
    钩子方法,子类借助这个方法执行一些特殊操作,如:AbstractRefreshableWebApplicationContext就使用该方法执行初始化ThemeSource的操作。
  7. 注册事件监听器
  8. 初始化所有单实例的Bean,放入Spring容器的缓冲池中
  9. 发布上下文刷新事件:创建上下文刷新事件,时间广播器负责将这些事件广播到每个注册的事件监听器中。

Spring加载Bean的流程

IoC流水线
下图描述了Spring容器从加载配置文件到创建出一个完整的Bean的作业流程及参与的角色
在这里插入图片描述

  1. ResourceLoader加载Spring配置信息
  2. BeanDefinitionReader读取解析配置信息。每个< bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中。
  3. 容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java反射机制自动识别出Bean工厂后处理器,并调用其对BeanDefinition进行加工处理。主要完成以下两项工作:
    (1). 对使用占位符的< bean>元素标签进行解析,得到最终配置值。
    (2). 扫描BeanDefinitionRegistry中的BeanDefinition,通过Java反射机制找出所有属性编辑器的Bean(实现java.beans.PropertyEditor接口的Bean),并自动将它们注册到spring容器的属性编辑器注册表中(PropertyEditorRegistry)
  4. spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用InstantiationStrategy着手进行Bean的实例化工作。
  5. 实例化Bean时,spring容器使用BeanWrapper对Bean进行封装。(BeanWrapper提供了很多以Java反射机制操作Bean的方法,它将结合该Bean的BeanDefinition及容器中的属性编辑器,完成Bean属性注入工作)
  6. 利用容器中注册的Bean后处理器(实现BeanPostProcessor接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出Bean。

BeanDefinition:对应< bean> 元素标签,分为半成品阶段和成品阶段
BeanDefinitionRegistry:相当于spring配置信息的内存数据库
InstantiationStrategy:负责根据BeanDefinition对象创建一个Bean实例
BeanWrapper完成Bean属性的填充工作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值