初学者阅读本篇文章时建议浅读即可,我刚开始学 Spring 的时候遇到这一部分内容基本也是懵逼的,作为了解,有个印象就好。

Spring 框架是一个大杂烩,融合了大约 20 个模块,开发者可以直接使用,例如:核心容器、数据访问/集成等,如下图所示:

1. 核心容器(Core Container)

这一部分是 Spring 的核心,要建立一个简单的 Spring 项目,这部分的内容必不可少,需要引入它包含的模块才算是个 Spring 框架。

1.1 Core 和 Beans

Spring-CoreSpring-Beans 两个模块是整个 Spring 框架的基础,提供了控制反转(Inversion of Control,IOC) 和 依赖注入(Dependency Injection,DI)功能。Spring-Beans 模块中存在一个 BeanFactory(Bean 工厂),作用就是不需要我们再使用 new 的方式创建对象,Spring 会自动管理对象,这些对象在 Spring 中被称为 Bean。

1.2 Context

Spring-Context 是以上面两个模块作为基础,提供了一个框架式的对象访问方式,初步了解,其功能是能够让我们在框架中随时访问到存在的对象(Bean)或者其他内容,想要获取这些上下文内容,ApplicationContext 接口是最常用的方式。Spring 中还有一个 Spring-Context-Support 模块,用于整合第三方库至 Spring 应用程序的上下文中,例如:高速缓存(EhCache、JCache)、任务调度(CommonJ)等,下面是一个通过上下文获取 Bean 的简单示例。

ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
User user = context.getBean("user", User.class);

1.3 SpEL

SpEL 全称 Spring Expression Language(Spring 表达式语言),它能使用一种简洁的方式将值装配至对象的属性或者构造器参数中,简单理解,在 xml 配置文件中,使用 bean 标签定义 Bean,在该标签中使用 property 标签对属性进行赋值,如下所示:

<bean id="user" class="xxx">
    <property name="name" value="#{"CareyQ".toUpperCase()}"></property>
</bean>

#{} 的方式就是 SpEL 的简单使用,这里只做了初步的了解,不再往深处叙述。

2. AOP、Aspects、Instrumentation

众所周知,Spring 中的一大核心特点就是面向切面编程(Aspect-oriented programming,AOP),本节标题三个模块都与横切相关,就放在一起叙述。

AOP 能够让开发者在不影响及修改原有程序的情况下加入新功能,原理是使用动态代理模式进行实现,能够降低程序的耦合性。

Aspects 模块用于提供与 AspectJ 的集成,AspectJ 则是一种 AOP 框架,AspectJ 单独就是另外一门语言,它有自己的编译器(ajc 编译器),让 Spring AOP 有多种实现 AOP 的方法。

Instrumentation 模块可以算是 AOP 的一个支持模块,能够在某些应用服务器中使用类检测功能和类加载,例如:Spring-instrument-tomcat 模块能够在 Tomcat 中使用类检测功能。其能在 JVM 启用时,生成一个代理类,开发者可以通过代理类在运行时修改类的字节,达到改变一个类的效果。

3. Messaging

该模块是 Spring 与消息系统集成的一个扩展支持,是一套抽象的 API 或者是一个标准,能够对消息发送端和消息接收端的模式进行约定。

4. 数据访问/集成(Data Access/Integration)

该模块中包含了 JDBC、ORM、OXM、JMS 和事务。

JDBC 提供了一个 JDBC 的抽象层,目的是为了简化使用 JDBC 的开发流程,它提供了一些模板来让开发者直接使用,例如:JdbcTemplate。

ORM 是对 ORM 框架集成提供支持,例如:JPA、Hibernate 等。

OXM 能够将对象映射为 XML 数据格式,也能将 XML 数据映射为对象。

JMS 用于消息的生产和使用,在 Spring 4.1 之后,与 Messaging 模块进行了集成。

事务(tx) 事务模块,用于实现特殊接口和所有对象类的编程和声明式事务管理。

5. Web

该模块中包含了 WebSocket、Servlet、Web 和 Portlet。

WebSocket 是 Spring 4.0 之后新增的模块,实现了 WebSocket 和 SocketJS,提供套接字通信和 Web 端推送功能。

Servlet 模块也称 WebMVC,就是 Spring 框架中的模型 - 视图 - 控制器,主要用于 Web 程序的 REST Web 服务的实现。

Web 模块提供了基本的 Web 特性,例如:文件上传功能、Web 程序上下文等。

WebFlux 一个新的非阻塞函数式 Reactive Web 框架,可以用于建立异步、非阻塞、事件驱动的服务。

6. Test

该模块支持使用 JUnit 或 TestNG 对 Spring 中的组件进行单元测试和集成测试。

7. 模块相互依赖关系