1 缘起
学习Spring注解过程中,发现不同的注解在不同的模块中,
如@RestController在spring-web,@DependOn在spring-context,
但,同属于Spring Framework,
于是打算再一次从Spring Framework开始梳理,
因为,之前在开发时,学习前人代码中对不同注解的使用,
但是,并没有形成体系,比较零散,
我学习Spring是从应用开始的,没有走Spring的设计、框架再到应用这个路线,
本末倒置了,并没有学习到Spring的精髓,
所以,在后来的学习中,逐步补齐Spring相关的设计、框架方面的知识。
现,分享Spring Framework这个项目,帮助读者从全局了解Spring的架构。
这里有个小插曲,我在Spring官网查找Spring Framework相关文档时,
官网只有近期的几个新版本,没有历史版本,
在看Spring Framework的文档时,官网最早的版本为5.2.22,
这个版本的文档中,并没有Spring Framework的示意图,
于是开始寻找历史文档,通过:https://docs.spring.io/spring-framework/docs
可以看到Spring Framework所有版本的文档,
发现,Spring Framework5.0.0.M5是包含Spring Framework运行时示意图的最后一个版本,从Spring Framework5.x发行版开始,官网文档就没有Spring Framwork运行时示意图了。
(1)SpringFramework文档各版本文档地址:https://docs.spring.io/spring-framework/docs
(2)SpringFramework 5.0.0.M5文档地址:https://docs.spring.io/spring-framework/docs/5.0.0.M1/spring-framework-reference/html/overview.html#overview-modules
2 Spring Framework
Spring Framework是Java平台。
为开发Java应用程序提供全面的基础设施支持,开发者只需专注于应用程序开发,其他的交给Spring。
2.1 设计理念
- 可配置。Spring让开发者尽可能推迟设计决策,比如,可以通过配置切换持久层供应商而无需修改代码逻辑,许多其他基础设施问题和集成第三方API也遵循这种设计。
- 灵活。Spring主张灵活设计,不限定如何实现功能,开发者可以因地制宜。
- 向后兼容。Spring非常谨慎地管理其版本迭代,因此Spring版本间几乎没有断层,保持良好的向后兼容性。Spring支持的JDK版本和第三方库都是精心设计的,以保证依赖于Spring的项目可以正常运作。
- 注重API设计。Spring团队投入大量的时间和精力设计简明的API,这些API可以横跨多个版本以及多年使用。
- 高代码质量。Spring Framework强调有意义、当前和准确的Java文档,Spring是极少数能声称代码简洁、包之间没有循环依赖的项目之一。
2.2 Spring Framework运行时
Spring Framework由20多个模块组成,开发者可以选择需要模块集成在项目中,
这些模块按照功能可划分为:
Core Container、Data Access/Integration、Web、AOP、Instrumentation、Messaging和Test,
示意图如下图所示。
2.2.1 Core Container
Core Container由模块spring-core、spring-beans、spring-context、spring-context-support和spring-expression组成。
模块spring-core和spring-beans提供基础设施,包括IoC和依赖注入。BeanFactory是工厂模式的复杂实现,消除了对单例的需求,允许将依赖的配置和规范与实际逻辑解耦。
spring-context模块构建在Core和Bean模块上,即以framework-style方式访问对象,类似于JNDI。Context模块继承Bean模块特性并且添加了对的国际化、事件传播、资源加载和上下文创建(如Servlet容器)支持。Context模块支持Java EE的特性,如EJB、JMX和基础远程处理。ApplicationContext接口是Context模块的接入点。spring-context-support为集成第三方库到Spring应用上下文提供支持,比如缓存(EhCache、JCache)和调度(CommonJ、Quartz)。
spring-expression模块为查询和在运行时操作对象图提供强大的表达语言。spring-expression是统一表达语言的扩展,该表达语言支持setting和getting操作属性值,属性分配,方法调用,访问数组、集合和索引内容,逻辑和数学计算,变量命名以及在Spring IoC容器中以名称检索对象,同时,支持列表映射和选择以及通用列表聚合。
2.2.2 AOP和Instrumentation
spring-aop模块提供符合AOP的面向切面编程实现,如允许自定义方法拦截器和切入点实现解耦。使用源码级别的元数据功能,可以将行为信息合并到代码中,类似于.NET属性。
spring-aspects模块提供集成AspectJ。
spring-instrument模块提供类仪器支持,类加载器实现会在特定的应用服务器中使用。spring-instrument-tomcat模块包含Tomcat代理。
2.2.3 Messaging
Spring Framework4包含spring-messaging模块,抽象自Spring整合项目如Message、MessageChannel、MessageHandler以及其他作为消息应用的服务。该模块包含一系列注解,将消息与方法进行映射,类似于Spring MVC注解编程模型。
2.2.4 Data Access/Integration
数据接入或集成层包括JDBC、ORM、OXR、JMS和事务模块。
spring-jdbc模块提供JDBC抽象层,去掉了冗余的JDBC编程和对析数据库供应商特定的错误编码的解析。
spring-tx模块对实现指定接口和所有POJO类提供编程和声明性事务支持。
spring-orm模块为流行的对象关系映射API提供集成层,包括JPA和Hibernate,通过spring-orm模块可以将这些O/R映射框架与Spring提供的所有其他功能结合使用,比如前面提到的声明式事务管理。
spring-oxm模块提供的抽象层支持Object/XML映射实现,如JAXB、Castor、JiBX和XStream。
spring-jms模块(Java消息服务)包含生产和消费消息特性,从Spring Framework4.1开始,提供集成spring-messaging模块。
2.2.5 Web
Web层由spring-web、spring-webmvc和spring-websocket模块组成。
spring-web模块提供基础的面向web集成特性,如多文件上传功能,使用Servlet监听器和面向web应用上下文进行IoC容器初始化。同时,包含HTTP客户端和Spring远程支持的web相关组件。
spring-webmvc模块(Web-Servlet模块)包含Spring的MVC(Model-View-Controller)和网络应用的REST网络服务实现。Spring的MVC框架为领域模型、web表单和集成的Spring Framework其他特性提供解耦。
2.2.6 Test
spring-test模块通过JUnit或TestNG支持Spring组件的单元测试和集成测试,提供Spring ApplicationContext和这些上下文缓存的载入,同时支持Mock对象用于隔离测试。
3 Spring Framework包含的项目
序号 | 组名(GroupId) | 项目名(ArtifactId) | 描述 |
---|---|---|---|
1 | org.springframework | spring-aop | AOP代理 |
2 | org.springframework | spring-aspects | 基于切面的AspectJ |
3 | org.springframework | spring-beans | Bean支持,包括Groovy |
4 | org.springframework | spring-context | 应用上下文运行时,包括调度和远程抽象 |
5 | org.springframework | spring-context-support | 支持集成通用第三方库到Spring应用上下文 |
6 | org.springframework | spring-core | 核心工具,供其他Spring模块使用 |
7 | org.springframework | spring-expression | Spring表达语言(SpEL) |
8 | org.springframework | spring-instrument | JVM启动仪器代理 |
9 | org.springframework | spring-instrument-tomcat | Tomcat仪器代理 |
10 | org.springframework | spring-jdbc | JDBC支持包,包括数据源配置和JDBC访问 |
11 | org.springframework | spring-jms | JMS支持包,包括帮助类发送和接收JMS消息 |
12 | org.springframework | spring-messaging | 支持消息架构和协议 |
13 | org.springframework | spring-orm | 对象关系映射,包括JPA和Hibernate支持 |
14 | org.springframework | spring-oxm | 对象/XML映射 |
15 | org.springframework | spring-test | 支持Spring组件单元测试和集成测试 |
16 | org.springframework | spring-tx | 事务基建,包括DAO和JCA |
17 | org.springframework | spring-web | Web支持包,包括客户端和远程web |
18 | org.springframework | spring-webmvc | Web应用的REST Web服务和MVC实现 |
19 | org.springframework | spring-websocket | WebSocket和SocketJS实现,支持STOMP |
4 小结
(1)Spring Framework是Java平台。为开发Java应用程序提供全面的基础设施支持,开发者只需专注于应用程序开发,其他的交给Spring。
(2)Spring Framework设计理念:可配置、灵活、向后兼容、注重API设计和高质量代码。
(3)Spring Framework分为6个模块:Web、Data Access/Integration、AOP、Messaging、Core Container和Test。