Spring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示
Core Container
Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块
Core和Beans模块是框架的基础部分,提供IoC(转控制)和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置
Spring-Core:核心工具类,Spring其他模块大量使用Spring-Core
Spring-Bean:Spring定义Bean的支持
Spring-Context:运行时Spring容器
Spring-Context-Support:Spring容器对第三方包的集成支持
Spring-Expression:使用表达式语言在运行时查询和操作对象
Data Access/Integration
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模块
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包中的各个源码包的功能如下:
Spring容器成功启动需要以下三方面的条件同时具备:
Spring启动时读取应用程序提供的Bean的配置信息,并在Spring容器中生成一份相应的Bean的配置注册表,然后根据这张注册表来实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。
bean的配置信息就是Bean的元数据信息,他由以下五个方面来组成:
接下来是他们之间的相互关系:
Ioc/DI
IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等。
先从我们自己设计这样一个视角来考虑:
所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。
对象和对象关系怎么表示?
可以用xml,properties文件等语义化配置文件表示。
描述对象关系的文件存放在哪里?
可能是classpath,filesystem或者是URL 网络资源,servletContext 等。
不同的配置文件对对象的描述不一样,如标准的,自定义声明式的,如何统一? 在内部需要有一个统一的关于对象的定义,所有外部的描述都必须转化成统一的描述定义。
如何对不同的配置文件进行解析?需要对不同的配置文件语法,采用不同的解析器
1.BeanDefinition
SpringIOC容器管理了我们定义的各种Bean对象及其相互的关系,Bean对象在Spring实现中是以BeanDefinition来描述的,其继承体系如下:
Bean 的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean 的解析主要就是对 Spring 配置文件的解析。
2.XmlBeanDefinitionReader
XML配置文件的读取是Spring中重要的功能,因为Spring的大部分功能都是以配置作为切入点的,可以从XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络,首先看看各个类的功能
整个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容器的实现供用户选择和使用,其相互关系如下:
BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。
这四个接口共同定义了 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的层次结构图以下相关类图
类图中各个类的作用:
XmlBeanFactory对DefaultListableBeanFactory类进行了扩展,主要用于从XML文档中读取BeanDefinition,对于注册及获取Bean都是使用从父类DefaultListableBeanFactory继承的方法去实现,而唯独与父类不同的个性化实现就是增加了XmlBeanDefinitionReader类型的reader属性。在XmlBeanFactory中主要使用reader属性对资源文件进行读取和注册
4.FileSystemApplicationContext
ApplicationContext是Spring提供的一个高级的IoC容器,它除了能够提供IoC容器的基本功能外,还为用户提供了以下的附加服务。
从ApplicationContext接口的实现,我们看出其特点:
常用的上下文有FileSystemApplicationContext、ClassPathXmlApplicationContext和XmlWebApplicationContext(Web项目用到)。