Spring 是为了解决企业级应用程序开发而创建的。随着 Spring 的发展,Spring 家族出现了多个产品线,包括 Spring Framework、Spring Boot、Spring Cloud、Spring Data、Spring Integration、Spring Batch、Spring Security 和 Spring Cloud Data Flow 等,不过本文主要介绍 Spring Framework。
如图1所示,Spring Framework 是一个分层框架,由多个模块组成,Spring 的这些模块主要包括:
这些模块都构建在核心容器模块之上。
核心容器(Core Container)模块提供了 Spring 框架的基本功能,分为 Core(即spring-core)、Beans(即spring-beans)、Context(即spring-context)和 Expression(即spring-expression)四个模块。
Core 和 Beans 是整个 Spring 框架的基础模块,也是 Spring 的控制反转与依赖注入的基本实现模块,Spring 的其他模块依赖 Core 和 Beans 这两个模块。
其他模块的核心,包含 Spring 框架的核心工具类,Spring 的其他模块都要使用该包里的类。
核心模块,定义对 Bean 的支持,负责访问配置文件,以及创建和管理 Bean,支持依赖注入和控制反转的相关操作。
spring-beans 模块有几个核心接口:BeanFactory 接口、BeanDefinition 接口和 BeanPostProcessor 接口。
上下文模块,是 Spring 运行时容器,提供对 Spring 的上下文支持,并提供一个框架式的对象访问方式,类似于一个 JNDI 注册表。
Application-Context 接口是该模块的关键,通过它可以方便、快捷地取出依赖注入的 Bean。
ApplicationContext 接口的实现类很多,如 ClassPathXmlApplicationContext、FileSystemXmlApplicationContext 和 AnnotationConfigApplicationContext 等。
为了整合第三方库到 Spring 应用程序的上下文中,Spring 还提供了 spring-context-support 模块,该模块提供了对高速缓存(EhCache和JCache)和调度(CommonJ和Quartz)的支持。
Spring 的表达式语言,用以帮助 Spring 在运行时查询和操作对象。
同时,该表达式还支持设置和获取对象的属性值及方法的调用,以及访问数组、集合和索引器的内容并支持查询和操作运行时对象,是对 JSP 2.1 规范中规定的统一表达式语言(Unified EL, UEL)的扩展。
AOP 模块是 Spring 框架的另一个核心模块,主要由 AOP(即spring-aop)、Aspects(即spring-aspects)和 Instrument(即spring-instrument)3 个子模块组成,提供面向切面的编程架构。
AOP 的主要实现模块。以 JVM 的动态代理技术为基础,设计出一系列面向切面编程的实现,如前置通知、后置通知、环绕通知、返回通知和异常通知等。同时,以 Pointcut 接口来匹配切入点,可以使用现有的切入点来指定横切面,也可以扩展相关方法,再根据需求进行切入。
集成自 AspectJ 框架,主要是为了给 Spring AOP 提供多种 AOP 实现方法。
基于 Java SE 中的 java.lang.instrument 进行设计,可以看作 AOP 的一个支援模块。
该模块的主要作用是在 JVM 启用时生成一个 agent 代理类,开发者通过这个 agent 代理类在运行时修改类的字节,从而改变一个类的功能,实现 AOP 的功能。例如,spring-instrument-tomcat 模块包含支持 Tomcat 的植入代理。
数据访问和集成模块是由 JDBC(即spring-jdbc)、ORM(即spring-orm)、OXM(即spring-oxm)、JMS(即spring-jms)和 Transactions(即spring-transactions)5 个子模块组成的。
主要提供 JDBC 的模板方法、关系型数据库的对象化方式、SimpleJdbc 方式及事务管理来简化 JDBC 编程,它实现的类是 JdbcTemplate、SimpleJdbcTemplate 及 NamedParameterJdbcTemplate。
通过 JdbcTemplate,消除了不必要的和烦琐的 JDBC 编码。
ORM 框架支持模块,主要集成 Hibernate、Java Persistence API(JPA)和 Java Data Objects(JDO),用于资源管理、数据访问对象(DAO)的实现和事务处理。
主要提供一个抽象层以支撑 OXM(Object to XML Mapping,提供一个支持对象或 XML 映射实现的抽象层,将 Java 对象映射成 XML 数据,或者将 XML 数据映射成 Java 对象),如 JAXB、Castor、XMLBeans、JiBX 和 XStream 等。
发送和接收信息的模块,自 pring 4.1 以后,它还提供对 spring-messaging 模块的支持。
事务控制实现模块。
Spring 框架对事务做了很好的封装,通过对该框架的 AOP 进行配置,可以将事务灵活地配置在任何一层,用以实现特殊接口和所有 POJO(普通 Java 对象)的类编程和声明式事务管理。
Web 模块建立在应用程序的上下文模块之上,为基于 Web 的应用程序提供上下文。该模块主要由 Web(即spring-web)、WebMVC(即spring-webmvc)、WebSocket(即spring-websocket)和 WebFlux(即spring-webflux)4 个子模块组成。
提供最基础的 Web 支持(如文件上传功能),以及初始化一个面向 Web 的应用程序上下文的 IoC 容器,同时也包含一些与 Web 相关的支持。
一个 Web-Servlet 模块,实现 Spring MVC(Model-View-Controller)的 Web 应用。其中 DispatchServlet 是核心类,它完成对请求的处理与返回。
Spring 的 MVC 框架让领域模型代码和 Web 表单之间能清晰地分离,并能与 Spring Framework 的其他功能集成。
基于 WebSocket 协议的 Web 实现。
基于 Reactor 实现异步非阻塞的 Web 框架。
Messaging(即spring-messaging)模块是从 Spring 4 开始新加入的,它的主要功能是为 Spring 框架集成一些基础的报文传送功能。
Test(即spring-test)模块主要为应用测试提供支持,它集成了 JUnit 框架,可以对 Spring 组件进行单元测试和集成测试。