SSM源码剖析读书笔记--第三章

本书是  互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析

Spring ApplicationContext的加载及源码实现

ApplicationContext是 Spring上下文的核心接口,描述 了 Spring容器的所有基本功能,是Spring Context(Spring上下文)模块 的核心设计。

从类型上看它虽 然是BeanFactory(因为它是 BeanFactory 的实现类),但比 BeanFactory 的功能更丰富,可以理解为ApplicationContext扩展了BeanFactory,

 

AbstractApplicationContext

AbstractApplicationContext是ApplicationContext实现 类中的核心抽象模板类,其中的核心方法refresh就是由 AbstractApplicationContext提供的。

 refresh方法是通过典型的模板方法设计模式实现的,但是我们都知 道模板方法有一个最大的弊端,就是要非常慎重地修改,特别是其顺序 不能改变,因为一旦发生了改变,已经实现好的子类就不会按照当初设 计的目标去执行了。

Spring的作者Rod Johnson是怎么规避模板方法的弊端的呢?

一是对 整个Spring模型的理解及对各个模块职责的明确划分;

二是在使用抽象 模板的高复用性的同时增加支持重写及注册响应核心处理实体的回调函 数,来增加整个模板方法的扩展性。

AbstractApplicationContext中的Refresh方法的代码:

SSM源码剖析读书笔记--第三章

SSM源码剖析读书笔记--第三章

SSM源码剖析读书笔记--第三章

 

Spring 上下文的加载虽然使用了模板模式,但是每个方法依赖的子 类实现都非常复杂,我们以refresh方法中代码调用依赖的顺序(图3-2)理解 Spring上下文的加载,同时从时序图中看看各个子类是怎么利用 AbstractApplicationContext模板方法来实现自己的实例加载的。

SSM源码剖析读书笔记--第三章

如图3-2所示,XmlWebApplicationContext 只负责配置文件部分的加 载;Application Context 负责整个容器的加载; AbstractRefreshApplicationContext 负责创建 Bean 工厂; AbstractRefreshConfigApplicationContext、 AbstractRefreshWebApplicationContext负责处理配置的加载及Web环境的 准备;XmlApplicationContext负责XML文件的加载、读取和解析。

 

其中,XmlWebApplicationContext通过

 

SSM源码剖析读书笔记--第三章

方法进行配置文件部分的加 载

而后介绍了Spring Boot的主 要启动类之一AnnotationConfigEmbeddedWebApplicationContext的加载流程,以及各类的核心职责。在这里略掉。

 

Spring XML文件标签加载解析及自定义

在加载Bean配置时先解析XML文件,然后获取特定的标签,找到 指定的Namespace Handler来解析XML文件,最后将Bean的描述信息注 册在工厂中并且完成整个解析流程。

接下来看看Spring是怎么从Document中解析自定义标签的。 BeanDefinitionParserDelegate 是专门用来把XML文档元素解析成 BeanDefinition实例的类,是Bean解析处理中非常重要的类。

从 Spring加载 XML文件到解析标签,在 XML文件中定义的每个标 签节点其实都是Spring 预先定义好的标签,包括用户自定义的标签。 XML 解析就是解析这些标签。从读取、解析到注册到工厂,Spring使用 了类似于SPI模式的高扩展模式,虽然现在提倡少配置文件,并且面向 编程、面向注解的开发越来越多,但是Spring这种有高度灵活性和扩展 性的设计风格越来越受欢迎,例如Spring Boot的许多加载和定制仍然使 用这种模式。

 

 

Spring注解的源码