简介
Spring最早的时候就是指的SpringFramework,后来有很多基于spring的扩展框架出现,如SpringBoot, SpringSecurity, SpringData, SpringCloud, SpringBatch等,我们统称其为SpringFamily(即SpringProjects)。Spring在狭义上指的就是SpringFramework,而广义上指的就是SpringFamily。
本系列基于SpringFramework5.2.0的官方文档,字里行间融合了本座的编程设计思想,其间有错误或不当之处请读者不吝赐教。本座邮箱为:lanny1358@163.com。
原则
对于框架的使用者来说,SpringFramework设计的指导性原则虽然并不重要,但其优秀的设计思想是值得借鉴的(区别程序员级别的主要考察点不是谁会更多的编程语言,而是对框架的设计的认知高度)。
以下便是SpringFramework设计的指导性原则:
- 在每个层次都提供选择:Spring允许您尽可能推迟设计决策。例如,您可以在不更改代码的情况下通过配置切换持久性提供者、日志打印方案。对于许多其他基础设施问题,以及与第三方api的集成也是如此。
- 容纳不同的观点:Spring拥抱灵活性,并不对事情应该如何做固执己见,它以不同的视角支持广泛的应用程序需求。
- 保持强烈的向后兼容性:Spring支持精心选择的JDK版本和第三方库,以促进依赖于Spring的应用程序和库的维护。
- 关心API设计:Spring团队将大量的思想和时间投入到制作api中,这些api是直观的,并且在许多版本和许多年里都能保持。
- 代码质量制定高标准:Spring框架非常强调有意义的、当前的和准确的Javadoc。它是为数不多的几个能够声称干净的代码结构,并且在包之间没有循环依赖关系的项目之一。
从上面几点指导性原则可以看出,Spring设计的最大特点就是面向接口编程,而面向接口编程本就是所有框架设计的核心。
架构
SpringFramework项目庞大,为了便于维护与使用,它被设计为许多高度解耦合的模块,开发者可以根据自己的需要选择某些模块。
SpringFramework5与SpringFramework4在模块划分上发生了较大的变化,主要体现在SpringFramework5添加了WebReactive模块,以更好地满足WEB的响应式编程。模块划分的变化在很大程度上体现的是设计思想的变化。
左图取自SpringFramework4的官方文档,右图为本座根据SpringFramework5的文档结构自行绘制的架构图(在SpringFramework5的官方文档中没有现成的架构图)。下面对SpringFramework5各个模块的作用做一个简单的介绍:
- Core:Spring框架的核心,提供对Bean的管理及其功能的扩展
- DataAccess:数据访问的管理,包括事务、ORM等
- Integration:提供了其他常用组件的集成方案
- WebServlet:spring提供的web开发框架
- WebReactive:spring提供的响应式web开发框架
- Test:测试相关功能
- Languages:提供可以运行在JVM之上的其他语言的支持
依赖包
在Java项目中,如果需要使用Spring提供的功能,必须引入相应的jar包,而Spring根据功能的不同划分出多个jar包,开发者可以根据自己的需要引入相应的jar包即可。
Spring的jar包主要有两种,一种实现了完整的模块功能,另一种只提供了模块框架让Spring容器或开发者调用,而具体的实现需要引入第三方包(如果第三方包不是基于该spring框架开发的,还需要引入适配器),这很像SPI机制,如Spring的orm框架整合mybatis,首先需要引入spring-orm.jar以提供spring对orm框架的支持,然后需要引入mybatis.jar以提供mybatis的功能,最后还需要提供spring-mybatis.jar以实现两者的适配。
- core:核心功能所需jar包,几乎所有其他功能都是建立在该功能之上的,所以是必不可少的
- spring-core:定义了一些基本概念并提供了一些基本工具,如资源加载、cglib代理功能等,这些工具既可以供Spring的其他模块使用,也可以供编程者直接使用
- spring-expression:提供spring表达式(SpEL)的支持
- spring-beans:最基本的容器管理工能,提供BeanFactory
- spring-context:在spring-beans容器的基础上进行了功能扩展,提供ApplicationContext,实际项目中使用的容器几乎都是基于ApplicationContext
- spring-context-support:对整合第三方的缓存、任务计划、邮件服务等框架提供支持
- aop:面向切面编程
- spring-aop:Spring提供的对面向切面的支持
- spring-aspects:整合了aspectj的编程风格,但底层依然基于spring-aop而非aspectj方式来实现面向切面功能
- data:数据库相关
- spring-jdbc:spring提供的对原生jdbc的进一步抽象,让数据库操作更方便
- spring-tx:spring提供的事务管理
- spring-orm:对整合第三方的orm(对象关系映射)框架提供支持
- spring-oxm:对整合第三方的oxm(对象XML映射)框架提供支持
- web:web编程支持
- spring-web:提供基本的web功能,无论是spring-webmvc或者structs集成spring都需要依赖此包
- spring-webmvc:基于spring-web提供了mvc框架
- spring-webflux:基于响应式编程的web框架
- spring-websocket:提供对websocket的支持
- 其他:
- spring-jms:对整合第三方的JMS(Java消息服务)协议实现提供支持。JMS是实现消息队列的一种协议(协议就是一种规范,实现消息队列还可以有其他协议,如AMQP,整合基于AMQP协议的消息队列需要的不是spring-jms包而是spring-amqp),ActiveMq、Redis基于JMS协议,RabbitMq基于AMQP协议。
- spring-test:测试相关