Spring 是一款用于简化企业级 Java 应用开发的分层开源框架,有着强大的扩展和融合能力,它善于整合各种单层框架并建立起完整的体系,能高效统一的构造可提供企业级服务的应用系统。
1、Spring 概述
Spring Framework 是一个分层非常清晰并且依赖关系、职责定位非常明确的轻量级架构,主要有以下八大模块:数据处理模块(Data Access/Integration)、Web 模块、AOP(Aspect Oriented Programming)模块、Aspects 模块、Instrumentation 模块、Messaging 模块、Core Container 模块和 Test 模块。
正是依靠着这些基本模块,Spring 实现了一个融合了现有解决方案的零侵入的轻量级框架,如图所示:
接下来,对八大模块进行必要的简要说明:
1、数据处理模块(Data Access/Integration):由 JDBC、ORM、OXM、JMS 和 Transactions 等模块组成。
- JDBC 模块:消除编写冗长的JDBC代码和解析数据库厂商特有的错误代码,它提供了Spring对JDBC数据访问进行封装的所有类;
- ORM 模块:提供了流行的 Object-Relational Mapping(对象-关系映射)API 集成层,包含JPA、JDO 和 Hibernate 等 ORM 框架。
Spring 对 ORM 的支持和封装主要体现在3个方面:①. 一致的异常处理体系结构,对第三方 ORM 框架抛出的专有异常进行了包装;②. 一致的DAO抽象的支持,为每个框架都提供了模板类来简化和封装常用操作,比如 JdbcSupport、HibernateTemplate;③. Spring 的事务管理机制,为所有数据访问都提供了一致的事务管理。
- OXM 模块:提供抽象层,用于支持 Object/XML mapping(对象/XML映射)的实现,例如JAXB、Castor、XMLBeans、JiBX 和 XStream 等;
- JMS 模块:即 Java Messaging Service,包含生产和消费信息的功能;
- Transactions 模块:支持编程和声明式事务管理。
2、Web 模块:由 Web、WebSocket、Servlet 和 Portlet 等模块组成。
- Web 模块:提供了面向 Web 开发的集成功能;
- WebSocket 模块:提供了面向 WebSocket 开发的集成功能。
- Servlet 模块(或 SpringMVC 模块):包含 Spring 的 Model-View-Controller 和 REST Web Services 实现的 Web 应用程序。Spring MVC 框架使 Domain Model(领域模型)代码和 Web Form(网页)代码实现了完全分离,并且集成支持了 Spring Framework 的所有功能。
- Portlet 模块(或 Portlet MVC 模块):是基于 Web 和 Servlet 模块的 MVC 实现的。
Portlet 和 Servlet 的最大区别是对请求的处理分为 Action 阶段和 Render 阶段。在处理一次 HTTP 请求时,在 Action 阶段处理业务逻辑响应并且当前逻辑处理只被执行一次;而在 Render 阶段随着业务的定制,当前处理逻辑会被执行多次,这样就保证了业务系统在处理同一个业务逻辑时能够进行定制性响应页面模版渲染。
3、AOP(Aspect Oriented Programming)模块:是 Spring 的代理模块,属于 Spring 的核心模块,它巧妙地利用了 JVM 动态代理和 CGLIB 动态代理面向过程编程,实现了业务零侵入、低耦合的效果。
为了确保 Spring 与其他 AOP 框架的互用性,Spring AOP 模块支持基于 AOP 联盟定义的 API,也就是 Aspect 模块,与 Spring IoC 模块相辅相成。其中,我们熟知且常用的事务管理就是利用 Spring AOP 模块实现的。Spring AOP 模块及 Spring 良好的架构设计及扩展性,使 Spring 可以融合基本上所有的模块及其他框架,成为真正的集大成者。
4、Aspects 模块:提供了与 AspectJ(一个成熟的功能强大的面向切面编程的框架)的集成,Aspects 扩展了 Java 语言,定义了 AOP 语法(织入点语法),持有一个专门的编译器来生成遵守 Java 字节编码规范的 Class 文件,使用字节码生成技术来实现代理。
5、Instrumentation 模块:是 Spring 对其他容器的集成及对类加载器的扩展实现,其子模块 spring-instrument-tomcat 实现了 Tomcat Instrumentation 代理功能。
6、Messaging 模块:是从 Spring 集成项目(比如 Message、MessageChannel、MessageHandler 及其他基于消息应用的基础模块)中抽象出来的,类似于基于注解的 Spring MVC 编程模块,包含一系列消息与方法的映射注解。
7、Core Container 模块(Spring 核心容器模块):它是 Spring 的基石,由 Core、Beans、Context、SpEL 四个子模块组成。
- Core 模块和 Beans 模块:提供了框架的基础部分,包含 IoC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)功能,使用 BeanFactory 基本概念来实现容器对 Bean 的管理,是所有 Spring 应用的核心。Spring本 身的运行都是由这种 Bean 的核心模型进行加载和执行的,是 Spring 其他模块的核心支撑,也是运行的根本保证。
- Context 模块(包含 Spring-Context 和 Spring-Context-Support 两个子模块):该模块是建立在 Core 模块和 Beans 模块的坚实基础之上,并且集成了 Beans 模块的特征,增加了对国际化的支持,也支持 Java EE 特征。ApplicationContext 接口是 Context 模块的重点和焦点。Spring-Context-Support 模块支持集成第三方常用库到 Spring 应用上下文中,例如缓存(EhCache、Guava)、调度 Scheduling 框架(CommonJ、Quartz)及模板引擎(FreeMarker、Velocity)。
- SpEL 模块:即 Spring-Expression Language,提供了强大的表达式语言来查询和操作运行时的对象。
8、Test 模块:支持通过组合 JUnit 或 TestNG 来进行单元测试和集成测试,并且提供了 Mock Object(模仿对象)方式进行测试。
Spring 的领域模型有三种,即容器领域模型、核心领域模型以及核心领域模型,下面也做下简要的说明。
- 容器领域模型(Context 模型,或上下文模型):对 Spring 核心领域模型进行生命周期管理。
- 核心领域模型(Bean 模型):体现 Spring 的一个重要核心理念,即一切皆 Bean,Bean 即一切。Bean 是应用运行时可执行的最小函数式(属性)单元,也可以是 Java 中的一个函数对象,更倾向于一种对象式的为某种特殊行为而生的可复用的概念,不受职责或者大小的限制。
Bean 模型是 Spring 的核心服务实体域,是应用要操作的本身,是每个线程的真正执行者,也是整个会话生命周期的管理者,还是 Spring 对外暴露的核心实体。
- 代理领域模型(Advisor 模型):Spring 代理的执行依赖于 Bean 模型,但是 Spring 代理的生成、执行、选择都依赖于 Spring 自身定义的 Advisor 模型,只有符合 Advisor 模型的定义,才能生成 Spring 代理。
2、搭建调试环境
2.1 构建工具--Gradle
这里,使用从 Gradle 官网链接下载 gradle4.3.1,下载 binary-only 即可,并解压到指定目录。
接着,配置 Windows 环境变量--系统变量--编辑环境变量,如图所示:
保存退出,然后 CMD 验证,使用 gradle -v 命令 ,如下:
安装成功后,gradle构建工具就准备完毕,接下来去下载 Spring5 源码了。
2.2 源码的下载、编译及导入
Spring5 源码可以从 github 获取,这里,我选择的是v5.1.5.RELEASE版本,如下所示:
拉取完 spring-framework-5.1.x 工程后,找到 gradlew.bat 脚本:
直接双击执行它即可。执行完成后,会出现 build success 提示语,说明工程构建成功。
接着,使用 IDEA 打开该工程,会执行构建编译相关任务和下载必需的jar包,下载jar包的过程比较长,需要耐心等待,如下图所示:
需要注意的是,JDK 要在1.8及以上,构建工具使用前面下载的 gradle 工具,在 IDEA--settings,设置gradle选项,如下:
当工程下所有的模块右下角都会有个小蓝色图标时,说明编译成功了,至此 Spring5 源码导入完成。
搭建完成调试环境后,就可以愉快的源码调试和学习了。