SSM源码剖析读书笔记--第二章
本书是 互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析
Core Container模块
该模块(也叫Spring核心容器模块)是Spring的根基,由Beans、 Core、Context、SpEL四个子模块组成,这四个子模块如下所述。
◎ Beans模块和Core模块提供框架的基础部分,包含IoC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)功 能,使用 BeanFactory 基本概念来实现容器对Bean的管理,是所有 Spring应用的核心。Spring本身的运行都是由这种Bean的核心模型进行 加载和执行的,是Spring其他模块的核心支撑,是运行的根本保证。
◎ Context(包含 Spring-Context和 Spring-Context-Support两个子模 块)模块建立在Core模块和 Beans模块的坚实基础之上,并且集成了 Beans模块的特征,增加了对国际化的支持,也支持Java EE特征。 ApplicationContext接口是Context模块的焦点。Spring-Context-Support模 块支持集成第三方常用库到Spring应用上下文中,例如缓存 (EhCache、Guava)、调度Scheduling框架(CommonJ、Quartz)及模 板引擎(FreeMarker、Velocity)。
◎ SpEL模块(Spring-Expression Language)提供了强大的表达式语 言来查询和操作运行时的对象。
Spring的领域模型有三种,如下所述。
(1)容器领域模型(Context模型):也叫作上下文模型,是 Spring的掌控域,对 Spring核心领域模型进行生命周期管理。也可以将 其称为Spring的服务域,因为它为整个应用服务。
(2)核心领域模型(Bean模型):体现了 Spring的一个核心理 念,即“一切皆 Bean,Bean即一切”。Bean是应用运行时可执行的最小函 数式单元,可以是一个属性单元,也可以是 Java 中的一个函数对象, 更倾向于一种对象式的为某种特殊行为而生的可复用的概念,不受职责 或者大小的限制。例如 Spring 上下文是一个 Bean,一个简单的描述型 的对象也是一个Bean。Bean模型是Spring的核心服务实体域,是应用要 操作的本身,是每个线程的真正执行者,也是整个会话生命周期的管理 者,还是Spring对外暴露的核心实体。
(3)代理领域模型(Advisor模型):Spring代理的执行依赖于Bean 模型,但是Spring代理的生成、执行及选择都依赖于 Spring自身定义的 Advisor模型,只有符合 Advisor模型的定义,才能生成Spring代理。
Context模块即Spring上下文模块(也叫Spring Context模块),是 Core Container模块的子模块,它让 Spring 真正成为一个可执行框架。 这个模块扩展实现了 BeanFactory,让它不仅仅是 BeanFactory。笔者认 为,Context 模块虽然是 BeanFactory 的实现者,但更是一个框架,这才 是它的主要职责。
Spring上下文的设计
核心抽象类的职责。
(1)ApplicationContext 是整个容器的基本功能定义类,继承了 BeanFactory,这说明容器也是工厂的多态实现。其实它利用了代理的设 计方法,内部持有一个 BeanFactory 实例,这个实例替它执行 BeanFactory 接口定义的功能,这种典型的代理模式应用也是非常巧妙 的。
(4)AbstractRefreshableApplicationContext是 XmlWebApplicationContext的核心父类,如果当前上下文持有 BeanFactory,则关闭当前BeanFactory,然后为上下文生命周期的下一 个阶段初始化一个新的BeanFactory,并且在创建新容器时仍然保持对其 父容器的引用。
Spring容器BeanFactory的设计
Spring 的核心功能就是实现对 Bean 的管理,比如 Bean 的注册、注 入、依赖等。而Spring容器提供了依赖注入这个特征,以实现 Spring 容 器对 Bean的管理,而且使用 IoC实现了对Bean的配置与实际应用代码的 隔离。其中,Core Container模块的核心概念就是BeanFactory,它是所 有Spring应用的核心。因为Spring的核心模型就是Bean模型,所以需要 在管理Spring Bean的基础上保证Spring应用的运行。
BeanFactory接口是Bean容器设计中基本的职责定义接口,定义了按 照名称、参数、类型等几个维度获取、判断Bean实例的职能。
Spring父子上下文与容器
虽然在 ApplicationContext 接口中也声明了 BeanFactory 接口中的功 能,但其实 Application Context 和 BeanFactory 并不是一个概念,只是 由于在 AplicationContext 实例中持有了BeanFactory实例,也就是说 BeanFactory实例只是AplicationContext的一个属性,由这个属性来帮助 ApplicationContext对外提供BeanFactory定义的功能实现。