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
2
3
4
5
6
7
8
//根据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);
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容器中的注册