随着Spring的不断发展,越来越多的技术体系融入了Spring生态中,从而诞生了一大批开发框架。但这些开发框架都是从Spring基础框架逐步演进而来的,本节将从Spring基础框架所包含的依赖注入和面向切面等核心概念开始,对整个Spring家族技术生态进行简要梳理。
Spring基础框架由Rod Johnson在2003年设计并实现,自诞生之初就被认为是一种容器,其整体架构如图1-1所示。
图1-1 Spring基础框架整体架构
我们先来看图1-1中位于底部的“核心容器”部分,该部分包含了一个容器所应该具备的主体功能,涉及基于依赖注入(Dependency Injection,DI)的JavaBean处理机制、面向切面编程(Aspect Oriented Programming,AOP)、上下文(Context)以及Spring自身所提供的表达式语言(Spring Expression Language,SpEL)等辅助功能。
对于系统开发而言,我们需要在系统运行时基于某个对象的使用需求,动态提供它所依赖的其他对象,而这一点可以通过依赖注入实现。Spring会在适当的时机创建一个Bean,然后像注射器一样把它注入目标对象中,这样就完成了对各个对象之间关系的控制。可以说,依赖注入是开发人员使用Spring基础框架的基本手段,我们通过依赖注入获取所需的各种Bean。Spring为开发人员提供了三种不同的依赖注入类型,分别是字段注入、构造器注入和Setter方法注入。
而所谓的切面,本质上解决的是关注点分离的问题。在面向对象编程的世界中,我们把一个应用程序按照职责和定位拆分成多个对象,这些对象构成了不同的层次。而面向切面编程可以说是面向对象编程的一种补充,目标是将一个应用程序抽象成各个切面,这样就可以将其单独抽象为独立的模块进行开发和维护。Spring为开发人员提供了连接点(JoinPoint)、通知(Advice)、切点(PointCut)和切面(Aspect)等一系列组件,帮助他们构建面向切面的编程模型。
我们再来看图1-1的上半部分,这里包含了构建应用程序所需要的两大功能组件,即数据访问和Web服务,它们也是我们日常开发中最常用的组件。这两大部分组件中包含的内容非常多,而且充分体现了Spring的集成性。也就是说,框架内部整合了业界主流的数据库驱动、消息中间件、ORM框架等各种工具,开发人员可以根据需要灵活地替换和调整自己想要使用的工具。
从开发语言上讲,虽然Spring最广泛的应用场景是在Java EE领域,但当前的5.x版本也支持Kotlin、Groovy以及各种动态开发语言。
我们通过Spring的官方网站来看一下Spring家族技术生态的全景图。在Spring的主页中,有七大核心技术体系。
可以看到,上述技术体系有各自的侧重点,但也有一些交集。我们现在能看到的所有Spring家族技术体系都是从Spring基础框架逐步演进而来的。Spring技术体系发展到现在,Spring基础框架更多扮演着内核的角色,而不是直接面向应用开发。在日常开发过程中,如果构建单块Web服务,可以采用Spring Boot。而如果想要开发微服务架构,那么就需要使用Spring Cloud。事实上,想要使用Spring Cloud,必须首先掌握Spring Boot,因为Spring Boot是开发单个微服务的基础。它们与Spring基础框架之间的这种“内核→应用→扩展”的关系如图1-2所示。
图1-2 Spring技术生态与Spring基础框架之间的关系示意图
本书不对Spring中的所有技术体系全面地展开讲解,而是重点关注Spring Boot。Spring Boot是Spring中顶级的子项目,并且已经发展为Java EE领域开发Web应用程序的首选框架。