Spring-IoC容器初始化

Spring Ioc容器

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

基本结构

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

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对象进行解析
            ↓
解析文件的等元素,Bean资源文件最终被解析成BeanDefinition对象,是资源原件在IoC中的映射
            ↓
BeanDefinition在IoC容器中进行注册

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

注意

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

困了Orz

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

你可能感兴趣的:(Spring)