Spring框架组件分析

来源:互联网 发布:淘宝物流详情页面html 编辑:程序博客网 时间:2024/06/07 07:02

      • 组件关系
      • Bean
        • Bean的定义
        • Bean的解析
      • Context
      • Core

Spring组件有十几个,但是真正核心的组件只有三个:Core,Context,Bean。如下图:

这里写图片描述

如果在它们三个中选出核心的话,那就非 Beans 组件莫属了, Spring 就是面向 Bean 的编程(BOP,Bean Oriented Programming),Bean 在 Spring 中才是真正的主角。Bean 在 Spring 中作用就像 Object 对 OOP 的意义一样。这由 Spring 框架的设计目标决定,Spring 解决了一个非常关键的问题他可以让你把对象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制。Spring 正是通过把对象包装在 Bean 中而达到对这些对象管理以及一些列额外操作的目的。它构建一个数据结构,然后根据这个数据结构设计他的生存环境,并让它在这个环境中按照一定的规律在不停的运动,在它们的不停运动中设计一系列与环境或者与其他个体完成信息交换。

组件关系

Bean:包装的是Object数据。

Context:发现每个 Bean 之间的关系,为它们建立这种关系并且要维护好这种关系。所以 Context 就是一个 Bean 关系的集合,这个关系集合又叫 Ioc 容器。

Core:发现、建立和维护每个 Bean 之间的关系所需要的一些列的工具,Core 这个组件叫 Util 更容易理解。

这里写图片描述

Bean

Bean 组件在 Spring 的 org.springframework.beans 包下。这个包下的所有类主要解决了三件事:Bean 的定义、Bean 的创建以及对 Bean 的解析。对 我们来说唯一需要关心的就是 Bean 的创建,其他两个由 Spring 在内部帮你完成了,对你来说是透明的。
Spring Bean 的创建时典型的工厂模式,他的顶级接口是 BeanFactory,下图是这个工厂的继承层次关系:

这里写图片描述

BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。

  • ListableBeanFactory:表示这些 Bean 是可列表的。
  • HierarchicalBeanFactory: 表示的是这些 Bean 是有继承关系的,也就是每个 Bean 有可能有父 Bean。
  • AutowireCapableBeanFactory:定义 Bean 的自动装配规则。

    DefaultListableBeanFactory:为最终的默认实现类 ,他实现了所有的接口。它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。

    这四个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为。

Bean的定义

Bean 的定义主要由 BeanDefinition 描述,如下图:

这里写图片描述
Bean 的定义就是完整的描述了在 Spring 的配置文件中你定义的 节点中所有的信息,包括各种子节点。当 Spring 成功解析你定义的一个 节点后,在 Spring 的内部他就被转化成 BeanDefinition 对象。以后所有的操作都是对这个对象完成的。

Bean的解析

Bean 的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean 的解析主要就是对 Spring 配置文件的解析。解析类如下图:

这里写图片描述

Context

Context 在 Spring 的 org.springframework.context 包下,他实际上就是给 Spring 提供一个运行时的环境,用以保存各个对象的状态。
ApplicationContext 是 Context 的顶级父类,他除了能标识一个应用环境的基本信息外,他还继承了五个接口,这五个接口主要是扩展了 Context 的功能。下面是 Context 的类结构图:
这里写图片描述

ApplicationContext 继承了 BeanFactory,这也说明了 Spring 容器中运行的主体对象是 Bean。
ApplicationContext 继承了 ResourceLoader 接口,使得 ApplicationContext 可以访问到任何外部资源。
ConfigurableApplicationContext 表示该 Context 是可修改的,也就是在构建 Context 中用户可以动态添加或修改已有的配置信息。
WebApplicationContext 顾名思义,就是为 web 准备的 Context 他可以直接访问到 ServletContext。

ApplicationContext 必须要完成以下几件事:
1. 标识一个应用环境
2. 利用 BeanFactory 创建 Bean 对象
3. 保存对象关系表
4. 能够捕获各种事件

Context 作为 Spring 的 Ioc 容器,基本上整合了 Spring 的大部分功能,或者说是大部分功能的基础。

Core

Core 组件作为 Spring 的核心组件,其中一个重要组成部分就是定义了资源的访问方式。这种把所有资源都抽象成一个接口的方式很值得在以后的设计中拿来学习。下图是 Resource 相关的类结构图:

这里写图片描述

  • Resource 接口封装了各种可能的资源类型,也就是对使用者来说屏蔽了文件类型的不同。
  • Resource 接口继承了 InputStreamSource 接口,这个接口中有个 getInputStream 方法,返回的是 InputStream 类。这样所有的资源都被可以通过 InputStream 这个类来获取,所以也屏蔽了资源的提供者。
  • ResourceLoader 接口屏蔽了所有的资源加载者的差异,只需要实现这个接口就可以加载所有的资源,他的默认实现是 DefaultResourceLoader。
  • Context 是把资源的加载、解析和描述工作委托给了 ResourcePatternResolver 类来完成,他相当于一个接头人,他把资源的加载、解析和资源的定义整合在一起便于其他组件使用。

学习整理,还望多多指导

0 0