Spring-IoC容器初始化

Spring Ioc容器

IoC容器最主要是对Bean对象的创建和依赖管里注入,是整个Spring IoC功能的核心

基本结构

Spring IoC结构很复杂,多个类继承实现关系混乱,但最基础的有三个
- BeanFactory,对IoC容器的基本行为做出了定义
这里写图片描述
- BeanDefinition,在IOC中可识别Bean资源文件的描述
这里写图片描述
- BeanDefinitionReader,加载Bean资源文件
这里写图片描述

Ioc容器初始化过程

这里举两个简单的例子

XmlBeanFactory容器

一个较为低级的IoC容器,实现了最基本的功能

//根据Xml配置文件创建Resource资源对象,该对象中包含了BeanDefinition的信息
 ClassPathResource resource =new ClassPathResource("application-context.xml");
//创建DefaultListableBeanFactory
 DefaultListableBeanFactory factory =new DefaultListableBeanFactory();
//创建XmlBeanDefinitionReader读取器,用于载入BeanDefinition。之所以需要BeanFactory作为参数,是因为会将读取的信息回调配置给factory
 XmlBeanDefinitionReader reader =new XmlBeanDefinitionReader(factory);
//XmlBeanDefinitionReader执行载入BeanDefinition的方法,最后会完成Bean的载入和注册。完成后Bean就成功的放置到IOC容器当中,以后我们就可以从中取得Bean来使用
 reader.loadBeanDefinitions(resource);

ApplicationContext容器

更为高级的IoC容器,除基本功能外,还支持信息源,可以实现国际化、访问资源和支持应用事件
因具体涉及的源代码很多,原理也较难解释清除,故只列出最基本的流程

ApplicationContext application = new FileSystemXmlApplicationContext(xmlPath);
            ↓
父类AbastractRefreshableConfigApplicationContext为容器设置Bean资源加载器
            ↓
资源加载器resourceLoader被赋值,设置资源文件路径,然后对资源文件路径进行解析
            ↓
调用refresh()方法,这是IoC容器初始化的入口
            ↓
创建IoC容器,子类启动载入过程;ConfigurableListableBeanFactory beanFactory = obtainBeanFactory();
            ↓
创建DefaultListableBeanFactory对象,装载beanFactory对象loadBeanDefinitions(beanFactory)
            ↓
新建Xml Bean读取器XmlBeanDefinitionReader对象,加载Bean资源文件
            ↓
resourceLoader.getSource(Location)获取资源
            ↓
加载Bean配置文件,对xml进行解析成Document对象
            ↓
按照Spring IoC识别的Bean规则在DefaultDefinitionDocumentReader中对Document对象进行解析
            ↓
解析文件的<Import>、<Alias>、<property>、<List>、<Set>等元素,Bean资源文件最终被解析成BeanDefinition对象,是资源原件在IoC中的映射
            ↓
BeanDefinition在IoC容器中进行注册

至此,Bean资源文件中配置的bean被解析成可以被IoC容器识别的对象且被注册管理起来,IoC容器可以进行索引、查询以及操作;被IoC容器管理起来后,也真正完成了IoC容器的初始化

注意

IoC容器中的注册就是维护了一个HashMap,保存了BeanDefinition对象,方便了后续的管理

困了Orz

从开始看到现在,四个多小时了,中间还喝了半瓶红葡萄酒,算是对Spring IoC容器的初始化了解了,明天再看AOP,现在真是困了…
睡觉

### Spring IOC 容器初始化过程解释 #### 资源定位阶段 Spring IOC容器初始化简单地可分为三个主要过程。第一个过程涉及资源定位,即`Resource`资源定位。这里的`Resouce`指的是`BeanDefinition`的资源定位。此过程中,容器负责寻找必要的数据文件,如XML配置文件或属性文件等,并将它们封装成`BeanDefinition`对象[^2]。 #### BeanDefinition加载阶段 第二个过程是`BeanDefinition`的载入。在此期间,用户预先定义好的Bean被转换为IOC容器内部使用的特定数据结构——`BeanDefinition`。这一步骤使得Bean可以在后续操作中被识别和管理,尽管此时这些Bean尚未实例化。 #### 注册BeanDefinition至容器 第三个也是最后一个过程涉及到向IOC容器注册上述创建的`BeanDefinition`。具体而言,这意味着将所有的`BeanDefinition`存储在一个类似于哈希表的数据结构内以便快速检索。通过Java反射机制,在适当的时候实际创建这些Bean的对象实例。 #### 刷新Bean工厂 除了以上提到的主要步骤外,还有一个重要的环节是在刷新应用上下文时调用的方法`obtainFreshBeanFactory()`。该方法执行两项重要任务:一是重置当前存在的任何旧版本的容器;二是利用`AbstractRefreshableApplicationContext.refreshBeanFactory()`函数生成新的容器实例,从而确保每次启动都能获得最新状态下的干净环境[^3]。 #### 实例化特殊处理器Beans 最后值得注意的是,在整个初始化流程接近尾声之际,会有一个专门用于处理实现了接口`BeanFactoryPostProcessor`的Bean的操作。这一类特殊的Bean会在其他普通Bean之前得到优先实例化并调用其相应的方法,以此实现对即将注入依赖关系之前的额外定制逻辑的支持[^4]。 ```java // 示例代码展示如何自定义一个BeanFactoryPostProcessor public class MyCustomConfig implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 自定义逻辑... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值