Spring框架概述和体系结构

介绍

什么是Spring

Spring是一个轻量级框架,是构建企业级应用程序的一站式解决方案。它的目标就是要简化Java企业级开发

Spring是分层的、模块化的,你可以按需引入需要的模块。最核心的模块就是IoC容器,这是Spring的基础,IoC容器用来管理bean的生命周期,在此基础之上,我们可以自行集成Web、消息传递、数据持久化、事务管理等组件。另一大核心是Spring所推崇的AOP(Aspect Oriented Programming,面向切面编程)编程方式,使用AOP编程方法补充了OOP(Object Oriented Programming,面向对象编程),减少了代码的重复,让我们更专注于业务

Spring是开源的,在多年不断的发展和创新中,除了Spring Framework(即我们通常说的Spring框架)之外,Spring家族还有如Spring Boot、Spring Data、Spring Cloud、Spring Batch等项目,几乎涵盖了应用程序所需的所有基础设施(从配置到安全,从web应用程序到大数据),体现着Spring的模块化设计

依赖注入和控制反转

Spring框架体系

(本框架体系描述的是spring 4.x版本)
Spring框架由大约20个模块组成的特性组成。这些模块分为核心容器、数据访问/集成、Web、AOP(面向方面编程)、工具、消息传递和测试。
Spring4框架体系图

核心容器

核心容器由spring-corespring-beansspring-contextspring-context-supportspring-expression(Spring Expression Language)模块组成。

  • spring-corespring-beans 模块提供了框架的基本部分,包括控制反转(Inversion of Control, IOC)和依赖注入(Dependency Injection, DI)。BeanFactory是一个复杂的工厂模式实现。它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦,BeanFactory 容器实例化后并不会自动实例化 Bean,只有当 Bean被使用时 BeanFactory 容器才会对该 Bean 进行实例化与依赖关系的装配。
  • spring-context 上下文模块构建在corebean模块之上:它是以一种类似JNDI注册的方式访问对象。Context模块继承Beans模块的特性,并添加了国际化(例如使用资源包)、事件广播、资源加载和透明地创建上下文(例如使用Servlet容器)的支持。context模块还支持EJB、JMX和基本远程处理等JavaEE特性。ApplicationContext是Context模块的核心接口。
    spring-context-support支持将常见的第三方库集成到Spring应用程序上下文中,用于缓存(EhCache、Guava、JCache)、邮件(JavaMail)、调度(CommonJ、Quartz)和模板引擎(FreeMarker、JasperReports、Velocity)。
  • spring-expression 模块是统一表达式语言(unified expression language,unified EL)的扩展,用于在运行时查询和操作对象图。该语言支持设置和获取属性值、属性赋值、方法调用、访问数组、集合和索引的内容、逻辑和算术操作符、命名变量,以及从Spring的IoC容器按名称检索对象。还支持列表映射、选择以及常见的列表聚合。

    AOP 和 Instrumentation

  • spring-aop 模块提供面向切面的编程实现,允许你定义方法拦截器和切入点对代码干净地解耦分离。使用源码级的元数据功能,还可以将行为信息以类似.NET属性的方式合并到代码中。
  • spring-aspects 模块集成自 AspectJ 框架, 主要是为 Spring AOP 提供多种 AOP 实现方法
  • spring-instrument 模块提供用于某些应用服务器的类instrumentation 支持和类加载器实现。
    spring-instrument-tomcat 模块用于Tomcat的Spring的instrumentation代理

Messaging

  • Spring Framework 4 包含spring-messaging模块,来自Spring集成项目的抽象,如Message、MessageChannel、MessageHandler等,用来提供基于消息的基础服务。该模块还包括一组用于将消息映射到方法的注解,类似于基于编程模型的Spring MVC的注解。

数据访问和集成

Data Access/Integration 层由JDBCORMOXMJMSTransaction 模块组成。

  • spring-jdbc 模块提供了JDBC抽象层,它消除了冗长的JDBC编码和对数据库供应商特定错误代码解析的需要。主要是提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,主要实现类是 JdbcTemplate、SimpleJdbcTemplate 以及 NamedParameterJdbcTemplate
  • spring-tx 模块支持对实现特殊接口的类和所有pojo(普通旧Java对象)进行编程式和声明式事务管理。
  • spring-orm 模块为流行的 object-relational mapping(对象-关系映射)API(包括JPA、JDO和Hibernate)提供了集成层。使用spring-orm模块,可以结合O/R映射框架与Spring提供的所有其他特性结合,如简单声明性事务管理特性。
  • spring-oxm模块提供了一个抽象层用于支持 Object/XML mapping (对象/XML映射)的实现,如JAXB、Castor、XMLBeans、JiBX和XStream。
  • spring-jms模块包含生成和消费消息的功能。从Spring4.1开始,提供了与spring-messaging模块的集成。

Web

Web层由spring-webspring-webmvcspring-websocketspring-webmvc-portlet模块组成。

  • spring-web 模块提供了基本的面向web的集成功能。例如多部分文件上传功能,使用Servlet listeners和面向Web的应用程序上下文初始化IoC容器。它还包含HTTP客户端和Spring远程访问web相关的部分的支持。
  • spring-webmvc 模块(也称为Web servlet模块)包含Spring的模型-视图-控制器(model-view-controller,MVC)和Web应用程序的REST Web服务实现。Spring的MVC框架提供了domain model(域模型)代码和web form之间的完全分离,并集成了Spring框架的所有其他特性。
  • spring-websocket 模块主要是与 Web 前端的全双工通讯的协议。
  • spring-webmvc-portlet 模块(也称为Web-Portlet模块)提供了要在Portlet环境中使用的MVC实现,并反映了基于servlet的spring-webmvc模块的功能。(该模块在Spring5中移除)
  • spring-webflux 是一个新的非堵塞函数式 Reactive Web 框架, 可以用来建立异步的、非阻塞、事件驱动的服务,并且扩展性非常好。(Spring5新模块)

Test

  • spring -test模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。它提供了Spring ApplicationContext的一致加载和这些上下文的缓存。它还提供了模拟对象,您可以使用这些模拟对象单独测试代码。

Spring 包之间的依赖关系

包列表

  • spring-core 核心工具类
  • spring-beans bean支持
  • spring-expression Spring表达式语言(SpEL)
  • spring-aop 基于代理的AOP支持
  • spring-aspects 基于AspectJ方面
  • spring-context 应用程序上下文运行时,包括调度和远程抽象
  • spring-context-support 支持将公共第三方库集成到Spring应用程序上下文中的类
  • spring-messaging 支持消息传递体系结构和协议
  • spring-instrument 用于JVM引导的插装代理
  • spring-instrument-tomcat Tomcat的插装代理
  • spring-jdbc JDBC支持包,包括数据源设置和JDBC访问支持
  • spring-tx 事务基础设施,包括DAO支持和JCA集成
  • spring-orm 对象/关系映射,包括JPA和Hibernate支持
  • spring-oxm Object/XML Mipmg 对象/ XML映射
  • spring-jms JMS支持包,包括发送/接收JMS消息的帮助类
  • spring-test 支持单元测试和集成测试Spring组件
  • spring-web 基本的web支持,包括web客户机和基于web的远程处理
  • spring-webmvc Servlet栈的基于http的模型-视图-控制器和REST端点
  • spring-websocket WebSocket和SockJS基础架构,包括STOMP消息传递支持
  • spring-webmvc-portlet 要在Portlet环境中使用的MVC实现

依赖关系图

spring-core依赖了commons-logging,而其他模块都依赖了spring-core,所以整个spring框架都依赖了commons-logging,如果有自己的日志实现如log4j,可以排除对commons-logging的依赖,没有日志实现而排除了commons-logging依赖,编译报错

下图是spring4的jar之间的直接依赖图,在maven中配置spring依赖时不会再混乱了,简洁配置

Spring4 jar包直接依赖图