文章目录
- Spring是什么?
- Spring设计初衷
- Spring设计原则
- Spring模块架构
- 核心容器(Core Container)
- 面向切面编程(AOP)和设备支持(Instrmentation)
- 报文发送(Messaging)
- 数据访问及集成(DataAccess/Integeration)
- Web
- 测试(Test)
- 日志(Logging)
- Spring中各模块的依赖关系
- Spring框架的优点
Spring是什么?
Spring对速度、简单性和生产力的关注使其成为世界上最流行的Java框架。Spring使Java编程变得更快、更容易和更安全。如今的Spring已经发展成为Java编程中不可缺少的一个庞大的生态体系。其中囊括了Spring FrameWork、Spring Boot、Spring Cloud等多个子项目。Spring可以指Spring整个体系家族,也可以指Spring FrameWork框架本身。本文中Spring代表的是Spring FrameWork框架。
Spring是一个开源的轻量级的Java开发应用框架,其目的是简化企业级应用程序开发。Spring框架被划分为多个模块。核心是核心容器的模块,包括一个配置模型(IOC)和一个依赖注入机制(DI)。应用程序可以选择它们需要的模块。除此之外,Spring框架还为不同的应用程序提供了基础支持,包括消息传递、事务数据和持久性以及web。还包括基于servlet的Spring MVC web框架,以及Spring WebFlux响应式web框架。此外还提供了与其他第三方框架集成的能力。
Spring设计初衷
Spring是为解决企业级应用开发的复杂性而设计,其最根本的使命是简化企业级应用开发。为了完成这一关键性使命,Spring主要采取了4个关键策略:
- 基于POJO 的轻量级和最小侵入性编程;
- 通过依赖注入(DI)和面向接口松耦合;
- 基于切面(AOP)和惯性进行声明式编程;
- 通过切面(AOP)和模板减少样板式代码;
Spring设计原则
Spring框架之所以能够如此备受欢迎、经久不衰,成为世界上最流行的Java框架,得益于Spring在设计和实现时严格遵循以下设计原则。
- 为每个层级提供选择。Spring允许尽可能的延迟设计决策。例如,您可以通过配置切换持久性提供程序,而无需更改代码。对于许多其他基础支持和与第三方api的集成也是如此。
- 适应不同的场景。Spring拥抱变化,它为不同的应用提供了不同的解决方案。
- 保持强大的向下兼容性。Spring的演进经过了精心的管理,使得版本之间很少有重大的冲突性变化。Spring支持多个JDK版本和第三方库,以方便对依赖Spring的应用和类库进行维护。
- 关注API设计。Spring团队花了大量的心思和时间来制作直观的api。
- 严格管控代码质量。Spring框架提供了最新的、准确的且非常有意义的javadoc。它是少数几个可以声明干净的代码结构,且包之间没有循环依赖关系的项目之一。
Spring模块架构
Spring框架有20多个模块组成。这些模块被整合在核心容器(Core Container)、面向切面编程(AOP)和设备支持(Instrmentation)、数据访问及集成(Data Access/Integeration)、Web、报文发送(Messaging)、测试(Test)和日志(Log)模块集合中。以下是Spring 5 的模块结构图:
核心容器(Core Container)
核心容器由spring-beans、spring-core、spring-context、spring-context-support和spring-expression模块组成。
spring-core和spring-beans是Spring框架的核心模块,提供了框架的基本功能,包括控制反转(IoC)和依赖注入(DI)。BeanFactory是Spring框架的核心接口,负责Spring中Bean的创建,是工厂模式的复杂实现。BeanFactory使用控制反转对应用程序的配置和依赖性规范与实际的应用程序逻辑进行解耦。
spring-context模块构建在spring-core和spring-beans之上。它继承了bean模块的特性,并添加了对国际化、事件传播、资源加载透明化的支持。此外该模块还提供了许多企业级支持,如邮件访问、远程访问、任务调度等。ApplicationContext是该模块的核心接口,它的超类是BeanFactory。ApplicationContext 容器实例化后会自动对所有的单实例Bean 进行实例化与依赖关系的装配,使之处于待用状态。
spring-context-support支持将第三方类库集成到Spring应用程序中,特别是缓存(EhCache、JCache)和调度(CommonJ、Quartz)。
spring-context-indexer模块提供了Spring的类管理和Classpath扫描功能。虽然类路径扫描非常快,但是Spring内部存在大量的类,使用spring-context-indexer模块,可以通过在编译时创建候选对象的静态列表来提高大型应用程序的启动性能。在此模式下,作为组件扫描目标的所有模块都必须引用spring-context-indexer模块。此模块仅支持spring5以上版本使用。
spring-expression 模块是统一表达式语言(EL)的扩展模块,用于在运行时查询和操作对象。该语言支持设置和获取属性值、方法调用、访问数组内容、集合和索引器、逻辑和算术运算等。
面向切面编程(AOP)和设备支持(Instrmentation)
spring-aop是Spring框架的另一个核心模块,是AOP主要的实现模块。在Spring 中,他是以JVM的动态代理技术为基础,设计出了一系列的AOP 横切实现,比如前置通知、返回通知、异常通知等,同时使用Pointcut接口来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入,从而实现了代码的解耦和分离。
spring-aspects模块提供了与AspectJ的集成。主要是为Spring AOP提供多种AOP实现方法。
spring-instrument模块提供了用于某些应用服务器中的类检测支持和类加载器实现。
报文发送(Messaging)
spring-messaging模块是Spring Framework 4新增加的一个Spring消息传递模块。主要职责是为Spring框架集成一些基础的报文传送应用。它具有来自Spring集成项目的关键抽象,如Message、MessageChannel、MessageHandler和其他抽象,可以作为基于消息传递的应用程序的基础。
数据访问及集成(DataAccess/Integeration)
数据访问/集成由spring-jdbc、spring-tx、spring-orm、spring-oxm、spring-jms和spring-r2dbc模块组成。
spring-jdbc模块是Spring 提供的JDBC抽象框架的主要实现模块,主要提供了JDBC模板方法、关系数据库对象化方法、SimpleJdbc方法、事务管理来简化Spring JDBC操作。主要实现类是JdbcTemplate、SimpleJdbcTemplate 以及NamedParameterJdbcTemplate。
spring-tx模块实现了Spring JDBC 编程式和声明式事务管理。Spring 对事务做了很好的封装,通过它的AOP 配置,可以灵活的配置在任何一层。
spring-orm模块是ORM框架的支持模块,提供了集成ORM框架(包括JPA和Hibernate)的api。使用spring-orm模块,可以将ORM框架与Spring提供的所有其他特性结合使用,比如前面提到的简单声明式事务管理。
spring-oxm模块主要提供一个支持OXM(Object-to-XML-Mapping,对象和XML映射)的抽象层。以支撑将java 对象映射成XML 数据,或者将XML 数据映射成java 对象,例如:JAXB、Castor、JiBX和XStream等。
spring-jms模块(Java Messaging Service)包含用于生成和消费消息的功能,Spring Framework 4.1开始,它就提供了与Spring messaging模块的集成。
spring-r2dbc模块是Spring5.3版本引入的新模块,旨在使用响应式模式对关系数据库进行访问。在实际应用当中spring-r2dbc应结合响应式框架Spring Webflux。在高并发场景下,使用WebFlux + R2DBC可以使单个请求的内存更少、响应更快。
Web
Web组件由spring-web、spring-webmvc、spring-websocket 和spring-webflux 4个模块组成。
spring-web模块提供了基本的面向web的基础特性,比如多文件上传、通过Servlet监听初始化IOC容器,也包含一些与Web 相关的支持。
spring-webmvc模块(也称为Web- servlet模块)包含Spring MVC(model-view-Controller)和用于Web应用程序的REST Web服务实现。Spring的MVC框架使逻辑代码和web表单分离,并集成了Spring框架的所有其他特性。
spring-websocket模块主要是与Web 前端的全双工通讯协议。
spring-webflux是一个新的非堵塞函数式Reactive Web框架,可以用来建立异步的,非阻塞的,事件驱动的服务,并且有很强的扩展性。
测试(Test)
spring-test模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。
日志(Logging)
Spring5为了集成日志框架,新增了一个日志模块spring-jcl,spring5.0.x以上版本自带jul日志。JCL原来是apache公司开源的一款抽象的日志框架,我们可以借助它来随意更换框架中使用的日志框架。但是apache公司目前已经不再维护。Spring对其进行了重写,封装了一个模块spring-jcl加入Spring框架。
Spring中各模块的依赖关系
Spring中的各个模块是相对独立的,但它们之间也存在一定的依赖关系。由于Spirng5以后都是采用Gradle来编译,所以在Spring5源码文件中,每个模块的Project下面都包含一个与模块同名,后缀名为.gradle的文件,如spring-aop下面包含spring-aop.gradle文件。这个文件中描述了每个模块所依赖的类库及其他说明。各模块间依赖关系图如下:
我们在学习Spring源码时,建议从spring-core 入手,其次是spring-beans 和spring-aop,随后是spring-context,再其次是spring-tx 和spring-orm,最后是spring-web 和其他部分。先研究Spring的IOC和DI,接着研究AOP和数据集成(JDBC、ORM、事务),最后再研究Web模块的实现。
Spring框架的优点
- 方便解耦,简化开发
Spring就是万能管家,可以管理所有对象的创建和依赖关系。 - 方便集成各种第三方框架
Spring提供了对各种第三方框架(如Hibernate、MyBatis等)集成的解决方案。 - 降低Java API 的使用难度
Spring对Java开发中非常难用的一些API(JDBC、JavaMail、远程调用等)都进行了封装,使这些 API 应用的难度大大降低。 - 方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。 - AOP编程的支持
Spring支持面向切面编程,可以方便地实现对程序进行权限拦截和日志监控等。 - 强大的Spring注解功能
Spring提供了一系列的注解标签,通过注解实现Bean间依赖,支持注解式事务管理。 - 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。