Spring学习(一):Spring的整体架构与容器的核心类

Spring的整体架构

Spring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示

Spring学习(一):Spring的整体架构与容器的核心类_第1张图片

Core Container

Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块 

Core和Beans模块是框架的基础部分,提供IoC(转控制)和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置

  • Core模块主要包含Spring框架基本的核心工具类
  • Beans模块是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control/Dependency Injection(Ioc/DI)操作相关的所有类
  • Context模块构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。Context模块继承了Beans的特性,为Spring核心提供了大量扩展,添加了对国际化(如资源绑定)、事件传播、资源加载和对Context的透明创建的支持。ApplicationContext接口是Context模块的关键
  • Expression Language模块提供了一个强大的表达式语言用于在运行时查询和操纵对象,该语言支持设置/获取属性的值,属性的分配,方法的调用,访问数组上下文、容器和索引器、逻辑和算术运算符、命名变量以及从Spring的IoC容器中根据名称检索对象

Spring-Core:核心工具类,Spring其他模块大量使用Spring-Core

Spring-Bean:Spring定义Bean的支持

Spring-Context:运行时Spring容器

Spring-Context-Support:Spring容器对第三方包的集成支持

Spring-Expression:使用表达式语言在运行时查询和操作对象

 

Data Access/Integration

  • JDBC模块提供了一个JDBC抽象层,它可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码,这个模块包含了Spring对JDBC数据访问进行封装的所有类
  • ORM模块为流行的对象-关系映射API,如JPA、JDO、Hibernate、iBatis等,提供了一个交互层,利用ORM封装包,可以混合使用所有Spring提供的特性进行O/R映射,如前边提到的简单声明性事务管理

Spring-JDBC:提供以JDBC访问数据库的支持

Spring-TX:提供编程式和声明式的事务支持

Spring-ORM:提供对对象/关系映射技术的支持

Spring-OXM:提供对对象/xml映射技术的支持

Spring-JMS:提供对JMS的支持

Spring的事务管理支持所有的ORM框架和JDBC

 

Web

Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文,所以Spring框架支持与Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。Web层包含了Web、Web-Servlet、Web-Struts和Web、Porlet模块

  • Web模块:提供了基础的面向Web的集成特性,例如,多文件上传、使用Servlet listeners初始化IoC容器以及一个面向Web的应用上下文,它还包含了Spring远程支持中Web的相关部分
  • Web-Servlet模块web.servlet.jar:该模块包含Spring的model-view-controller(MVC)实现,Spring的MVC框架使得模型范围内的代码和web forms之间能够清楚地分离开来,并与Spring框架的其他特性基础在一起
  • Web-Struts模块:该模块提供了对Struts的支持,使得类在Spring应用中能够与一个典型的Struts Web层集成在一起
  • Web-Porlet模块:提供了用于Portlet环境和Web-Servlet模块的MVC的实现

Spring-Web:提供基础的Web集成功能,在Web项目中提供Spring的容器

Spring-Webmvc:提供基于Servlet的Spring MVC

Spring-WebSocket:提供WebSocket功能

Spring-Webmvc-Portlet:提供Portlet环境支持

该模块还提供了与其他应用交互的远程调用方案。Spring远程调用功能集成了RMI(Remote Method Invocation远程方法调用)、Hessian、BurlapJAX-WS,同时Spring还自带HTTP invoker。

 

AOP

AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中

Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务,通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中

Spring-Aop:基于代理的AOP支持

Spring-Aspects:基于AspectJ的AOP支持

 

Test

Test模块支持使用Junit和TestNG对Spring组件进行测试

Spring为JNDI、Servlet和Portlet编写单元测试提供了一系列的mock对象

 

Spring的生态

Spring发展到现在已经不仅仅是Spring框架本身的内容,Spring目前提供了大量的基于Spring的项目,可以用来更深入地降低我们的开发难度,提高开发效率。

目前Spring的生态里主要有以下项目,我们可以根据自己项目的需要来选择使用相应的项目:

Spring Web Flow:基于Spring MVC提供基于向导流程式的Web应用开发

Spring Web Services:提供基于契约优先的WebService模型

Spring Security:通过认证和授权保护应用,声明式的安全机制

Spring Integration:通过消息机制对企业集成模式(EIP)的支持

Spring Batch:简化及优化大量数据的批处理操作

Spring Data:对主流的关系型和Nosql数据库的支持,为其持久化提供了简单的编程模型

Spring Social:于社交网络API(如Facebook、新浪微博等)的集成

Spring Mobile:提供对手机设备检测的功能,给不同的设备返回不同的页面的支持

Spring for Android:主要提供在Android上消费Restful API的功能

Spring Boot:使用默认开发配置来实现快捷开发

Spring XD:用来简化大数据应用开发

Spring Cloud:为分布式系统开发提供工具集

Spring HATEOAS:基于HATEOAS原则简化REST服务开发

Spring AMQP:对基于AMQP的消息的支持

Spring LDAP:简化LDAP开发

Spring Session:提供一个API及实现来管理用户会话信息

 

beans包的层级结构

beans包中的各个源码包的功能如下:

  • src/main/java 用于展现Spring的主要逻辑
  • src/main/resources 用于存放系统的配置文件
  • src/test/java 用于对主要逻辑进行单元测试
  • src/test/resources 用于存放测试用的配置文件

Spring容器成功启动需要以下三方面的条件同时具备:

  • Spring的类包必须已经放在Spring的类容器下面
  • 应用程序应当为Spring提供完备的Bean的配置信息
  • Bean的类都已经放在Spring的类容器下面    

Spring启动时读取应用程序提供的Bean的配置信息,并在Spring容器中生成一份相应的Bean的配置注册表,然后根据这张注册表来实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。

bean的配置信息就是Bean的元数据信息,他由以下五个方面来组成:

  1. Bean的实现类
  2. Bean的属性信息 比如:数据源的连接数,用户名和密码等等。
  3. Bean的依赖关系 Spring根据依赖关系配置完成Bean之间的装配
  4. Bean的行为配置 比如:生命周期范围以及生命周期各个过程的回调函数等
  5. Bean的创建方式定义 主要说明是通过构造器还是工厂方法来构造Bean

接下来是他们之间的相互关系:

Spring学习(一):Spring的整体架构与容器的核心类_第2张图片

Ioc/DI

   IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等。

先从我们自己设计这样一个视角来考虑:

所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。

对象和对象关系怎么表示?

可以用xml,properties文件等语义化配置文件表示。

描述对象关系的文件存放在哪里?

可能是classpath,filesystem或者是URL 网络资源,servletContext 等。

不同的配置文件对对象的描述不一样,如标准的,自定义声明式的,如何统一? 在内部需要有一个统一的关于对象的定义,所有外部的描述都必须转化成统一的描述定义。

如何对不同的配置文件进行解析?需要对不同的配置文件语法,采用不同的解析器

核心类介绍

1.BeanDefinition

   SpringIOC容器管理了我们定义的各种Bean对象及其相互的关系,Bean对象在Spring实现中是以BeanDefinition来描述的,其继承体系如下:

Spring学习(一):Spring的整体架构与容器的核心类_第3张图片

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

2.XmlBeanDefinitionReader

Spring学习(一):Spring的整体架构与容器的核心类_第4张图片

XML配置文件的读取是Spring中重要的功能,因为Spring的大部分功能都是以配置作为切入点的,可以从XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络,首先看看各个类的功能

  • ResourceLoader:定义资源加载器,主要应用于根据给定的资源文件地址返回对应的Resource
  • BeanDefinitionReader:主要定义资源文件读取并转换为BeanDefinition的各个功能
  • EnvironmentCapable:定义获取Environment方法
  • DocumentLoader:定义从资源文件加载到转换为Document的功能
  • AbstractBeanDefinitionReader:对EnvironmentCapable、BeanDefinitionReader类定义的功能进行实现
  • BeanDefinitionDocumentReader:定义读取Document并注册BeanDefinition功能
  • BeanDefinitionParserDelegate:定义解析Element的各种方法

整个XML配置文件读取的大致流程,在XmlBeanDefinitionReader中主要包含以下几步处理

(1)通过继承自AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件

(2)通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件

(3)通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析,并使用BeanDefinitionParserDelegate对Element进行解析

3.BeanFactory

    Spring Bean的创建是典型的工厂模式,这一系列的Bean工厂,也即IOC容器为开发者管理对象间的依赖关系提供了很多便利和基础服务,在Spring中有许多的IOC容器的实现供用户选择和使用,其相互关系如下:

Spring学习(一):Spring的整体架构与容器的核心类_第5张图片

BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。

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

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

最基本的IOC容器接口BeanFactory

public interface BeanFactory {    
   
 //对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,    
     //如果需要得到工厂本身,需要转义           
  String FACTORY_BEAN_PREFIX = "&"; 
      
     //根据bean的名字,获取在IOC容器中得到bean实例    
    Object getBean(String name) throws BeansException;    
    
     //根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。    
      Object getBean(String name, Class requiredType) throws BeansException;    
     
     //提供对bean的检索,看看是否在IOC容器有这个名字的bean    
      boolean containsBean(String name);    
     
     //根据bean名字得到bean实例,并同时判断这个bean是不是单例    
     boolean isSingleton(String name) throws NoSuchBeanDefinitionException;    
     
     //得到bean实例的Class类型    
     Class getType(String name) throws NoSuchBeanDefinitionException;    
     
     //得到bean的别名,如果根据别名检索,那么其原名也会被检索出来    
    String[] getAliases(String name);    
     
 }

在BeanFactory里只对IOC容器的基本行为作了定义,根本不关心你的bean是如何定义怎样加载的。正如我们只关心工厂里得到什么的产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心。

DefaultListableBeanFactory

DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现,而对于XmlBeanFactory与DefaultListableBeanFactory不同的地方其实是在XmlBeanFactory中使用了自定义的XML读取器XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取,DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory并实现了ConfigURableListableBeanFactory以及BeanDefinitionRegistry接口。以下是ConfigURationListableBeanFactory的层次结构图以下相关类图

 Spring学习(一):Spring的整体架构与容器的核心类_第6张图片

类图中各个类的作用:

  • AliasRegistry:定义对alias的简单增删改等操作
  • SimpleAliasRegistry:主要使用map作为alias的缓存,并对接口AliasRegistry进行实现
  • SingletonBeanRegistry:定义对单例的注册及获取
  • BeanFactory:定义获取bean及bean的各种属性
  • DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现
  • HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory定义的功能的基础上增加了对parentFactory的支持
  • BeanDefinitionRegistry:定义对BeanDefinition的各种增删改操作
  • FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能
  • ConfigurableBeanFactory:提供配置Factory的各种方法
  • ListableBeanFactory:根据各种条件获取bean的配置清单
  • AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurationBeanFactory的功能
  • AutowireCapableBeanFactory:提供创建bean、自动注入、初始化以及应用bean的后处理器
  • AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现
  • ConfigurableListableBeanFactory:BeanFactory配置清单,指定忽略类型及接口等
  • DefaultListableBeanFactory:综合上面所有功能,主要是对Bean注册后的处理

XmlBeanFactory对DefaultListableBeanFactory类进行了扩展,主要用于从XML文档中读取BeanDefinition,对于注册及获取Bean都是使用从父类DefaultListableBeanFactory继承的方法去实现,而唯独与父类不同的个性化实现就是增加了XmlBeanDefinitionReader类型的reader属性。在XmlBeanFactory中主要使用reader属性对资源文件进行读取和注册

4.FileSystemApplicationContext

Spring学习(一):Spring的整体架构与容器的核心类_第7张图片

ApplicationContext是Spring提供的一个高级的IoC容器,它除了能够提供IoC容器的基本功能外,还为用户提供了以下的附加服务。

从ApplicationContext接口的实现,我们看出其特点:

  • 支持信息源国际化。(实现MessageSource接口)
  • 访问资源。(实现ResourcePatternResolver接口) 
  • 支持应用事件。(实现ApplicationEventPublisher接口)

常用的上下文有FileSystemApplicationContext、ClassPathXmlApplicationContext和XmlWebApplicationContext(Web项目用到)。

 

你可能感兴趣的:(Spring学习)