`

Spring学习笔记(2)——设计理念

阅读更多

       我们知道Bean包装的是Object,而Object必然有数据,如何给这些数据提供生存环境就是Context要解决的问题,对Context来说他就是要发现每个Bean之间的关系,为它们建立这种关系并且要维护好 这种关系。所以Context就是一个Bean关系的集合,这个关系集合又叫Ioc容器,一旦建立起这个Ioc容器后Spring就可以为你工作了。那Core组件又有什么用武之地呢?其实Core就是发现、建立和维护每 个Bean之间的关系所需要的一些列的工具,从这个角度看来,Core这个组件叫Util更能让你理解。

它们之间可以用下图来表示:

三个组件关系
图2.三个组件关系

 

核心组件详解

这里将详细介绍每个组件内部类的层次关系,以及它们在运行时的时序顺序。我们在使用Spring是应该注意的地方。

 

Bean组件

前面已经说明了Bean组件对Spring的重要性,下面看看Bean这个组件式怎么设计的。Bean组件在Spring的org.springframework.beans包下。这个包下的所有类主要解决了三件事:Bean的定义、Bean 的创建以及对Bean的解析。对Spring的使用者来说唯一需要关心的就是Bean的创建,其他两个由Spring在内部帮你完成了,对你来说是透明的。

SpringBean的创建时典型的工厂模式,他的顶级接口是BeanFactory,下图是这个工厂的继承层次关系:

Bean工厂的继承关系 
图4.Bean工厂的继承关系

 

BeanFactory有三个子类:ListableBeanFactory、HierarchicalBeanFactory和Autowire Capable Bean Factory。但是从上图中我们可以发现最终的默认实现类是DefaultListableBeanFactory,他实 现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在Spring内部在操作过程中对象的传递和转化过程中,对对象的 数据访问所做的限制。例如ListableBeanFactory接口表示这些Bean是可列表的,而HierarchicalBeanFactory表示的是这些Bean是有继承关系的,也就是每个Bean有可能有父Bean。 AutowireCapableBeanFactory接口定义Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系、以及Bean行为。

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

Bean定义的类层次关系图
图5.Bean定义的类层次关系图

 

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

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

Bean的解析类
图6.Bean的解析类

 

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

 

Context组件

Context在Spring的org.springframework.context包下,前面已经讲解了Context组件在Spring中的作用,他实际上就是给Spring提供一个运行时的环境,用以保存各个对象的状态。下面看一下这个 环境是如何构建的。

ApplicationContext是Context的顶级父类,他除了能标识一个应用环境的基本信息外,他还继承了五个接口,这五个接口主要是扩展了Context的功能。下面是Context的类结构图:

Context相关的类结构图
图7.Context相关的类结构图

 

从上图中可以看出ApplicationContext继承了BeanFactory,这也说明了Spring容器中运行的主体对象是Bean,另外ApplicationContext继承了ResourceLoader接口,使得ApplicationContext可以访 问到任何外部资源,这将在Core中详细说明。

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

ConfigurableApplicationContext表示该Context是可修改的,也就是在构建Context中用户可以动态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的Context,即 AbstractRefreshableApplicationContext类。

WebApplicationContext顾名思义,就是为web准备的Context他可以直接访问到ServletContext,通常情况下,这个接口使用的少。

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

 

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

◆标识一个应用环境

◆利用BeanFactory创建Bean对象

◆保存对象关系表

◆能够捕获各种事件

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

 

Core组件

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

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

Resource相关的类结构图
图8.Resource相关的类结构图

 

从上图可以看出Resource接口封装了各种可能的资源类型,也就是对使用者来说屏蔽了文件类型的不同。对资源的提供者来说,如何把资源包装起来交给其他人用这也是一个问题,我们看到Resource 接口继承了InputStreamSource接口,这个接口中有个getInputStream方法,返回的是InputStream类。这样所有的资源都被可以通过InputStream这个类来获取,所以也屏蔽了资源的提供者。另外还有一 个问题就是加载资源的问题,也就是资源的加载者要统一,从上图中可以看出这个任务是由ResourceLoader接口完成,他屏蔽了所有的资源加载者的差异,只需要实现这个接口就可以加载所有的资源, 他的默认实现是DefaultResourceLoader。

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

Context和Resource的类关系图
图9.Context和Resource的类关系图

 

从上图可以看出,Context是把资源的加载、解析和描述工作委托给了ResourcePatternResolver类来完成,他相当于一个接头人,他把资源的加载、解析和资源的定义整合在一起便于其他组件使用。 Core组件中还有很多类似的方式。

 

http://blog.csdn.net/u011225629/article/details/45417619

分享到:
评论

相关推荐

    spring培训学习笔记

    Spring的核心理念是轻量级和非侵入性,它旨在减少应用程序对特定技术的依赖,从而提高代码的可复用性和可维护性。 **控制反转(IoC,Inversion of Control)**: IoC是Spring的核心特性之一,它反转了传统对象创建...

    java框架学习笔记spring笔记

    Spring 的设计理念是“依赖注入”(Dependency Injection,简称 DI)和面向切面编程(Aspect-Oriented Programming,简称 AOP),这使得代码更易于测试、维护和扩展。 1. **依赖注入**:Spring 框架的核心特性就是...

    达内spring笔记代码

    - "note_ziliao"可能包含了更多关于Spring的学习笔记和资料,包括常见问题解答、案例分析和练习题,对于巩固理论知识和提升实践能力大有裨益。 通过以上各个阶段的学习,可以逐步理解并熟练运用Spring框架,为实际...

    spring学习心得

    首先,我们来理解Spring的核心理念——依赖注入。依赖注入是一种设计模式,它允许我们通过外部容器(如Spring IoC容器)来管理对象的生命周期和依赖关系,而不是由对象自身负责。这样做的好处在于降低了对象间的耦合...

    spring视频教程种子

    1. **Spring概述**:讲解Spring的基本概念,包括它的设计理念和主要模块,以及如何在项目中引入Spring框架。 2. **IoC容器**:详述Spring的核心——IoC容器,包括Bean的生命周期管理、Bean的定义与实例化、Bean的...

    spring-framework:spring-framework原始阅读笔记-spring源码阅读

    通过深入阅读Spring Framework的源码,我们可以更深刻地理解其设计理念和实现机制,这对于优化代码、解决实际问题以及参与开源项目都大有裨益。无论是容器的精细控制,还是AOP的灵活应用,或是SpringMVC的高效开发,...

    自学b站黑马ssm框架思维导图XMind笔记

    2. **03bean实例化&生命周期.xmind** —— Spring Bean的实例化和生命周期管理 - Bean的实例化:Spring支持多种方式创建Bean,如构造函数注入、静态工厂方法、实例工厂方法等。 - 生命周期管理:包括初始化、正常...

    达内云笔记项目完整代码+注释

    通过深入研究和模仿这个项目,开发者不仅可以掌握基本的Java Web开发技能,还能了解到企业级应用的设计理念和最佳实践。无论你是初学者还是有一定经验的开发者,这个项目都值得你投入时间和精力去探索和学习。

    J2EE三大框架_笔记(个人收藏)

    Struts1虽然已经较为老旧,但其设计理念在后续的Struts2中得到了延续和改进。 这三大框架的组合使用,可以构建出高效、稳定且易于维护的企业级应用。Spring作为整体的容器,管理应用的生命周期和依赖;Hibernate...

    开题报告ssm462网络类课程思政学习系统的设计与实现+vue开题报告.doc

    【开题报告——网络类课程思政学习系统的设计与实现】\n\n1.1 研究背景\n\n当前的教育模式面临诸多挑战。一方面,传统的教学方式往往局限于课堂,学生获取学习资料的方式受限,如笔记记录和打印资料,且不同教师的...

    BookShow软件

    【BookShow软件——电子图书阅览系统的实现】 BookShow软件是一款专为用户提供电子图书阅览服务的系统,它旨在方便用户高效、便捷地...其背后的技术实现和设计理念,为软件开发领域提供了宝贵的实践经验和学习案例。

    SmartDentalNotate:智能牙科笔记

    《智能牙科笔记——以Java技术驱动的创新实践》 智能牙科笔记系统,作为一个以Java为核心技术构建的软件应用,旨在提升牙科医生的工作效率和病患的诊疗体验。在医疗信息化日益发展的今天,这样的系统显得尤为重要。...

Global site tag (gtag.js) - Google Analytics