Spring 三大基础组件简介

 

 

一,Bean,Core,Context关系

 

在Spring的各种组件中,Bean,Core,Context算是基础组件(ExpressionLanguage表达式支持, 这个主要就是用来支持一些spring

XML配置文件表达式 和 注解中一些表达式解析,让配置有动态特性,spring早期的版本是没有这货的,不算是特别必须的,

特别核心的东西,只是为了灵活性加的),在Core container这一层构建起了整个Spring的骨骼架构。在Spring中,强调的是对Bean的管理

,所以Bean是Spring所要面向的对象,就像是我们的oop一样,object是我们要面向的。

spring的依赖注入主要解决的问题就是把对象之间的关系用配置文件来描述,而这个注入关系在一个叫IOC容器中管理,所以这个容器中

放置的就是被bean包裹的对象,通过把对象包装在bean中来达到对对象的管理以及进行一些额外的操作。

 

三大核心组件关系(from 热心网友,thx~~):

Bean 包装的是 Object,而 Object 必然有数据,如何给这些数据提供生存环境就是 Context要解决的问题,对 Context 来说他就是

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

又叫 Ioc 容器,一旦建立起这个 Ioc 容器后 Spring 就可以为你工作了。那 Core 组件又有什么用武之地呢?其实Core 就是发现

、建立和维护每个 Bean 之间的关系所需要的一些类的工具,从这个角度看来,Core 这个组件叫 Util 更能让你理解。

 

把Bean 比作一场演出中的演员的话,那 Context 就是这场演出的舞台背景,而 Core应该就是演出的道具了。只有他们在一起

才能具备能演出一场好戏的最基本的条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表演的节目足够的精彩,这些节目

就是 Spring 能提供的特色功能了。

 

 

 

二,核心组件简介

 

1,Bean组件

 

 

 

 

 

在Spring中,BeanFactory定义了spring容器的核心规范,它有三个子类:HierarchicalBeanFactory,AutowireCapableBeanFactory,

ListableBeanFactory。ListableBeanFactory 接口表示这些Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean

是有继承关系的,也就是每个 Bean 有可能有父Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。

之后有很多接口跟实现类。每个接口都有他使用的场合,它主要是为了区分在 Spring内部在操作过程中对象的传递和转化过程中,

对对象的数据访问所做的限制。沿着上面的图观察,找到最后面,会发现最终的默认的实现类是DefaultListableBeanFactory。

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

 

Bean 的定义主要有由BeanDefinition 描述,如下图说明了这些类的层次关系:

 

 

 

Bean 的定义就是完整的描述了在 Spring 的配置文件中你定义的 <bean/>节点中所有的信息,包括各种子节点。当 Spring 成功解析

你定义的一个 <bean/> 节点后,在 Spring 的内部他就被转化成BeanDefinition 对象。以后所有的操作都是对这个对象完成的。

Bean的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。

Bean 的解析主要就是对 Spring配置文件的解析。这个解析过程主要通过下图中的类完成:

 

 

 

 

当然还有具体对 tag 的解析这里并没有列出。

 

 

 

2,Context组件

 

 

 

 

从上图中可以看出 ApplicationContext 继承了 BeanFactory,这也说明了 Spring容器中运行的主体对象是 Bean,另外

ApplicationContext 继承了 ResourceLoader 接口,使得ApplicationContext 可以访问到任何外部资源,这将在 Core 中详细说明。

ApplicationContext 的子类主要包含两个方面:

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

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

总体来说 ApplicationContext 必须要完成以下几件事:

  • 标识一个应用环境
  • 利用 BeanFactory 创建 Bean 对象
  • 保存对象关系表
  • 能够捕获各种事件

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

 

3,Core组件

 

Core 组件作为 Spring的核心组件,他其中包含了很多的关键类,其中一个重要组成部分就是定义了资源的访问方式。这种把所有资

源都抽象成一个接口的方式很值得在以后的设计中拿来学习。下面就重要看一下这个部分在Spring 的作用。

下图是 Resource 相关的类结构图:

 

 

 

从上图可以看出 Resource接口封装了各种可能的资源类型,也就是对使用者来说屏蔽了文件类型的不同。对资源的提供者来说,

如何把资源包装起来交给其他人用这也是一个问题,我们看到Resource 接口继承了 InputStreamSource 接口,这个接口中有个

getInputStream 方法,返回的是 InputStream类。这样所有的资源都被可以通过 InputStream这个类来获取,所以也屏蔽了资源

的提供者。另外还有一个问题就是加载资源的问题,也就是资源的加载者要统一,从上图中可以看出这个任务是由ResourceLoader

接口完成,他屏蔽了所有的资源加载者的差异,只需要实现这个接口就可以加载所有的资源,他的默认实现是DefaultResourceLoader。

下面看一下 Context 和 Resource 是如何建立关系的?首先看一下他们的类关系图:

 

 

 

 

从上图可以看出,Context 是把资源的加载、解析和描述工作委托给了 ResourcePatternResolver类来完成,他相当于一个接头人,

他把资源的加载、解析和资源的定义整合在一起便于其他组件使用。Core 组件中还有很多类似的方式。

 

 

 

 

 

时间: 2024-09-17 07:56:47

Spring 三大基础组件简介的相关文章

PHP开发框架Yii Framework教程(22) UI组件 Zii组件简介

前面介绍了Yii框架支持的部分UI组件,除了前面介绍的UI组件外,Yii框架还提供了Zii组件库,包括列表视图ListView,表 格视图GridView,此外还包括一些基于JQuery的UI组件,如AutoComplete,DataPicker, Button, Drag 和 Drop等,Zii组件主要 定义在包zii.* ,zii.widget.* 开发框架Yii Framework教程(22) UI组件 Zii组件简介-yii2 user组件"> 由于其中部分UI组件和数据源(Dat

iOS高可控性日历基础组件-SKCalendarView的使用和实现

简述 SKCalendarView是一个高可控性的日历基础组件,为了提高应用的自由度,默认只提供了日历部分的视图封装,但不涵盖切换月份按钮.年月分显示等非关键性控件,但请不要担心,SKCalendarView为你提供了多样性的API,你可以很轻松的拿到这些信息去展示在你自己的自定义控件中,以及对当前UI的修改:如:替换日历主题图片.节假日或特殊日期的日历背景.各种现实颜色等等.不仅如此,SKCalendarView还为你封装了公历.农历.节假日以及中国24节气的核心算法,即使你觉得默认的视图并不

Kubernetes基础组件概述

本文讲的是Kubernetes基础组件概述[编者的话]最近总有同学问Kubernetes中的各个组件的相关问题,其实这些概念内容在官方文档中都有,奈何我们有些同学可能英文不好,又或者懒得去看,又或者没有找到,今天有时间就专门写了这篇博客. [深圳站|3天烧脑式Kubernetes训练营]培训内容包括:Kubernetes概述.架构.日志和监控,部署.自动驾驶.服务发现.网络方案等核心机制分析,进阶篇--Kubernetes调度工作原理.资源管理及源码分析等. 本文主要介绍Kubernetes的基

关于Linux开源项目基础组件make编译流程

 关于Linux开源项目基础组件make编译流程 很多Linux开源项目都会用到编译出可执行文件的make,这个是有一套流程的. 首先,GNU构建系统:https://en.wikipedia.org/wiki/GNU_build_system 使用Autotool来编译和管理整个产品的生产流程. 就是下面这张图: 这里面需要先了解make和makefile make:https://en.wikipedia.org/wiki/Make_(software) makefile:https:/

spring的Controller组件什么时候需要序列化?

问题描述 spring的Controller组件什么时候需要序列化? 什么时候需要implements Serializable 什么时候不需要? 解决方案 Controller组件基本不需要,因为它不是数据. 解决方案二: 序列化是指把对象(层次化的)表示成序列(线性化的),因为网络传输.文件存储都是线性的.一般来说,实体类,pojo类才需要序列化. 解决方案三: Controller组件我是没有用过,但是实体类entity类(javabean)倒是用过.你应该要先明白序列化是什么?然后就知道

Razor基础语法简介

原文:Razor基础语法简介Razor的出现,使页面看起更加简洁,Razor的页面后缀为:.cshtml Razor基础语法: 1.代码注释:       多行注释: @*注释信息*@      单行注释: // 注释 1.代码体{...} @{ var x=100; var y=100; string str="this is string": } 在代码体中,没一行都需要用";"结束,代码区中,字母区分大小写.字符类型常量必须用""括起来,

VS2010 c# 怎样实现基础组件COM支持对接口IID的QueryInterface调用?急求。。。。

问题描述 VS2010c#怎样实现基础组件COM支持对接口IID的QueryInterface调用?急求....

马化腾:连接、云平台、安全是“互联网+制造”的三大基础

本文讲的是 :  马化腾:连接.云平台.安全是"互联网+制造"的三大基础  ,   [IT168 资讯]8月25日上午,2017中国两化融合大会在北京国家会议中心召开,会上腾讯董事会主席兼首席执行官马化腾发表演讲称,"互联网+制造"有三个重要的基础:连接.云平台.安全.他指出,国内制造业存在数十种之多的信息协议,建议政府牵头顶层设计,促成自主可控的协议标准,来打破制造业的信息孤岛. 马化腾认为"互联网+"是手段,数字经济是结果,网络强国是目标.工

发扬EJB,Spring思想将组件化进行到底

EJB.Spring,这不是Java界最有名的两大冤家,何以把它们扯在一起.其实Spring乃是EJB1.x.2.x的继承者,正如EJB之前的COM.CORBA.他们的思想一脉相承,那就是企业级的组件化思想,也可称之为理想! 一.非组件化的国内软件行业 各个行业的企业总有一些核心业务,长久保持不变,新时期的新业务基本上都是围绕核心业务展开.很长时间以来,IT技术的变化与企业业务的扩展存在着很大的矛盾.当企业的新业务开展之后,如何保证原有业务稳定运行的同时,新业务能够得到IT的支持与扩展?当IT技