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,现在真是困了…
睡觉