Spring 阅读源码笔记
Spring 阅读源码笔记(原创)
什么是控制反转
所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。
对象和对象关系怎么表示?
可以用 xml , properties 文件等语义化配置文件表示。描述对象关系的文件存放在哪里?
可能是 classpath , filesystem ,或者是 URL 网络资源, servletContext 等。有了配置文件,还需要对配置文件解析
不同的配置文件对对象的描述不一样,如标准的,自定义声明式的,如何统一? 在内部需要有一个统一的关于对象的定义,所有外部的描述都必须转化成统一的描述定义。如何对不同的配置文件进行解析?需要对不同的配置文件语法,采用不同的解析器
IOC容器接口
BeanFactory
最顶层的一个接口类,它定义了IOC容器的基本功能规范,他下面有三个子类分别是(ListableBeanFactory,HierarchicalBeanFactory,AutowireCapableBeanFactory),这四个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为。
ListableBeanFactory
表示这些 Bean 是可列表的HierarchicalBeanFactory
表示这些 Bean 是有继承关系的AutowireCapableBeanFactory
表示这些 Bean 的自动装配规则
IOC容器实现
XmlBeanFactory
最基础的容器实现,这个IOC容器可以读取XML文件定义XML文件中对bean的描述(BeanDefinition)ClasspathXmlApplicationContext
高级的IOC容器实现ApplicationContext
高级的IoC容器实现,并附加了(国际化MessageSource,访问资源ResourcePatternResolver,应用事件ApplicationEventPublisher)的实现
SpringIOC容器管理了我们定义的各种Bean对象及其相互的关系,Bean对象在Spring实现中是以BeanDefinition来描述的
IOC容器初始化
- BeanDefinition的Resource定位
- BeanDefinition的Resource载入
- BeanDefinition的Resource注册
IOC容器创建过程
IOC容器创建分为两种
XmlBeanFactory
FileSystemXmlApplicationContext
XmlBeanFactory创建
1 | //根据Xml配置文件创建Resource资源对象,该对象中包含了BeanDefinition的信息 |
FileSystemXmlApplicationContext创建
- 执行FileSystemXmlApplicationContext的构造函数
- 设置资源加载器(父类super)和资源定位(AbstractRefreshableConfigApplicationContext中的setConfigLocations)
- AbstractApplicationContext的refresh函数载入Bean
- AbstractRefreshableApplicationContext实现载入Bean
- AbstractBeanDefinitionReader读取Bean定义资源
- 资源加载器获取要读入的资源
- XmlBeanDefinitionReader加载Bean定义资源
- DocumentLoader将Bean定义资源转换为Document对象
- XmlBeanDefinitionReader解析载入的Bean定义资源文件
- DefaultBeanDefinitionDocumentReader对Bean定义的Document对象解析
- BeanDefinitionParserDelegate解析<Bean>定义资源文件中的Bean元素
- BeanDefinitionParserDelegate解析<property>元素
- 解析<property>元素的子元素
- 解析<list>子元素
- 解析过后的BeanDefinition在IoC容器中的注册