Spring核心组件详解

Bean组件

Bean组件在org.springframework.beans包下,这个包下的所有类主要解决了三件事:Bean的创建,Bean的定义,Bean的解析,对Spring的使用者来说,唯一要关心的是Bean的创建,其他两个由Spring在内部自己完成

  • Spirng Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory,下面是这个工厂的继承关系:
    在这里插入图片描述
    BeanFactory有三个子类,ListableBeanFactory, HierarchicalBeanFactory和AutowireCapableBeanFactory,但是最终的默认实现类是DefaultListableBeanFactory,实现了所有接口。
  • 每个接口有自己对应的使用场景,是为了区分在Spring内部对象的传递和转化过程中,对对象的数据所做的限制,例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的这些 Bean 是有继承关系的,也就是每个 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这三个个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为。
  • Bean的定义主要有BeanDefinition描述,如下图描述了这些类的层次关系
    在这里插入图片描述
    Bean的定义就是完整的描述了在Spring配置文件中自己定义的节点中所有的信息,包括各种子节点。当Spring成功解析定义的一个节点后,在Spring内部就会转化为BeanDefinion对象,以后所有操作都是对这个对象完成的。
  • Bean的解析过程非常复杂,功能被分的很细,因为这里需要被拓展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean的解析主要是对Spring配置文件的解析。这个解析通过下图中的类完成:
    在这里插入图片描述
    当然还有对tag的解析没有列出来

Context组件

  • Context 在 Spring 的 org.springframework.context 包下,通过上篇文章已经了解了Context中Spring中的作用,它实际是给Spring提供一个运行时的环境,用以保存各个对象的状态。

  • ApplicationContext是Context的顶级父类,它除了能标识一个顶级应用环境的基本信息外,还继承了5个接口,这5个接口主要是扩展了Context对象的功能。下面是Context的类结构图:
    在这里插入图片描述

  • 继承了BeanFactory接口,说明了Spring容器中运行的主体是Bean,另外继承了ResoureLoader接口,使得Application可以访问到任何外部资源,这将在Core中详细说明。

  • Application的子类主要包含两个方面:
    1.ConfigurableApplication表示该Context是可修改的,也就是在构建Context中用户可以动态添加或修改已有的配置信息,他下面又有多个子类,其中最经常使用的是可更新的Context,即AbstractRefreshableApplicationContext类。
    2.WebApplicationContext:是为web环境准备的Context,它可以直接访问到ServletContext,通常情况下,这个接口使用的少

    再往下分就是按照构建 Context 的文件类型,接着就是访问 Context 的方式。这样一级一级构成了完整的 Context 等级层次。

  • 总体来说Application必须要完成一下几件事:

    • 标识一个应用环境

    • 利用BeanFactory创建Bean

    • 保存对象关系

    • 捕获各种事件

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

Core组件

  • Core作为Spring的核心组件,包含了很多关键类,其中一个重要组成部分就是定义了资源的访问方式。这种把所有资源定义成一个接口的方式值得在以后的设计中拿来学习。下面是Resource的类结构图:
    在这里插入图片描述
    从上图可以看出Resource封装各种可能的资源类型,也就是对资源使用者屏蔽了文件类型的不同,对资源提供者来说,Resource继承了InputStreamSource接口,这个接口有个getInputStream方法,返回的是InputStream类。这样所有的资源都可以通过InputStream这个类来获取,所以也屏蔽了资源的提供者。同时通过ResourceLoader来统一资源的加载者,屏蔽了所有资源加载者的差异,他的默认实现是DefaultResorceLoader。

  • 下面看下Context和Resource是如何建立关系的?首先看下他们的类关系图:
    在这里插入图片描述
    从上图可以看出,Context把所有的资源加载工作交给了ResourecePatternResolver,它相当于一个接头人,它把所有的资源的加载,解析和资源的定义整合在一起便于其他组件的使用。Core中还有很多类似的方式。

猜你喜欢

转载自blog.csdn.net/qq_39530375/article/details/84529871