spring源码学习(二)---Spring容器的基本实现

Spring容器的基本实现

1.1 beans包的层级结构

  • ​ src/main/java 用于展示spring的主要逻辑
  • ​ src/main/resources 用于存放项目的配置文件
  • ​ src/test/java 用来存放测试的文件
  • ​ src/test/resource 用来存放测试的配置文件

spring源码学习(二)---Spring容器的基本实现

1.2 读取beans中的文件的两个核心类

1.2.1 DefaultListableBeanFactory

  • 这个类是整个bean加载的核心部分。
  • 其继承体系如图所示spring源码学习(二)---Spring容器的基本实现
1.2.1.1 XmlBeanFactory
  • 由于不同的XML文件中的字符编码和约束方式不相同,所以采用XmlBeanFactory来继承DefaultListableBeanFactory(另一个核心类),XmlBeanFactory中有着自定义的XML读取器XmlBeanDefinitionReader**,可以准确的读取XMl文件中的内容,是**spring注册加载bean的默认实现。

1.2.2 XmlBeanDefinitionReader

  • ​ 这个类用于读取spring环境中的XMl配置文件,因为spring的大部分功能都是以配置作为切入点的。
  • 继承体系如图所示。spring源码学习(二)---Spring容器的基本实现

1.3 容器的基础 XmlBeanFactory

​ 通过一行代码来对spring的容器功能有更具体的了解。

BeanFactory bf = new XmlBeanFactory(new classPathResource(“xxx.xml”));

  • 分析一下这行代码的执行过程。

  • 先执行ClassPathResource的构造方法返回Resource对象。

  • 分析Resouce接口封装底层资源

    spring源码学习(二)---Spring容器的基本实现
    spring源码学习(二)---Spring容器的基本实现

    spring源码学习(二)---Spring容器的基本实现

  • Resource接口继承了InputStreamSource接口,继承了getInputStream()获取输入流的这一方法。于是在加载文件的时候可以采用一下代码

    Resouce resource = new ClassPathResouce(“xxx.xml”);

    InputStream inputStream = resouce.getInputStream();

    //根据输入流对文件进行解析。

  • 类似的,也可以采用相同的方法对其它路径的文件进行解析。

    查看实现InputStreamSource的类,可以对系统中文件进行解析。spring源码学习(二)---Spring容器的基本实现

1.4加载bean的过程

  1. 在实例化XmlBeanFactory的过程中,

spring源码学习(二)---Spring容器的基本实现

可以看到**this.reader.loadBeanDefinitions(resource);**是资源加载的真正实现.

spring源码学习(二)---Spring容器的基本实现

spring源码学习(二)---Spring容器的基本实现

(EncodedResource实现了resource接口,目的是生成一个有编码的InputStream)

,在后面一个的重载方法中做了三件事,

  • 获取对XMl文件的验证模式.(DTD或XSD)
  • 加载XML文件,获得相应的Document.
  • 根据返回的Document注册Bean信息.