spring源码学习(二)---Spring容器的基本实现
Spring容器的基本实现
文章目录
1.1 beans包的层级结构
- src/main/java 用于展示spring的主要逻辑
- src/main/resources 用于存放项目的配置文件
- src/test/java 用来存放测试的文件
- src/test/resource 用来存放测试的配置文件
1.2 读取beans中的文件的两个核心类
1.2.1 DefaultListableBeanFactory
- 这个类是整个bean加载的核心部分。
- 其继承体系如图所示
1.2.1.1 XmlBeanFactory
- 由于不同的XML文件中的字符编码和约束方式不相同,所以采用XmlBeanFactory来继承DefaultListableBeanFactory(另一个核心类),XmlBeanFactory中有着自定义的XML读取器XmlBeanDefinitionReader**,可以准确的读取XMl文件中的内容,是**spring注册加载bean的默认实现。
1.2.2 XmlBeanDefinitionReader
- 这个类用于读取spring环境中的XMl配置文件,因为spring的大部分功能都是以配置作为切入点的。
- 继承体系如图所示。
1.3 容器的基础 XmlBeanFactory
通过一行代码来对spring的容器功能有更具体的了解。
BeanFactory bf = new XmlBeanFactory(new classPathResource(“xxx.xml”));
-
分析一下这行代码的执行过程。
-
先执行ClassPathResource的构造方法返回Resource对象。
-
分析Resouce接口封装底层资源
-
Resource接口继承了InputStreamSource接口,继承了getInputStream()获取输入流的这一方法。于是在加载文件的时候可以采用一下代码
Resouce resource = new ClassPathResouce(“xxx.xml”);
InputStream inputStream = resouce.getInputStream();
//根据输入流对文件进行解析。
-
类似的,也可以采用相同的方法对其它路径的文件进行解析。
查看实现InputStreamSource的类,可以对系统中文件进行解析。
1.4加载bean的过程
- 在实例化XmlBeanFactory的过程中,
可以看到**this.reader.loadBeanDefinitions(resource);**是资源加载的真正实现.
(EncodedResource实现了resource接口,目的是生成一个有编码的InputStream)
,在后面一个的重载方法中做了三件事,
- 获取对XMl文件的验证模式.(DTD或XSD)
- 加载XML文件,获得相应的Document.
- 根据返回的Document注册Bean信息.