购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 Spring概述

自Spring诞生以来,在Java企业级应用中应用广泛,致力于简化传统Java企业级应用开发的烦琐过程。

其实Spring的意义远不止是一个应用框架,下面就来详细解读Spring。

3.1.1 Spring的含义

Spring有狭义与广义之说。

1.狭义上的Spring—Spring Framework

狭义上的Spring特指Spring框架(Spring Framework)。Spring框架是为了解决企业级应用开发的复杂性而创建的,它的主要优势之一就是分层架构。分层架构允许使用者选择使用哪一个组件,同时为Java EE应用程序开发提供集成的框架。Spring框架使用基本的POJO来完成以前只可由EJB完成的事情。Spring框架不局限于服务器端的开发,而且从简单性、可测试性和松耦合的角度来看,Java应用开发也可以从Spring框架中获益。Spring框架的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring框架是一个分层的、面向切面与Java应用的一站式轻量级开源框架。

Spring框架的前身是Rod Johnson在Expert One-on-One J2EE Design and Development一书中发表的包含3万行代码的附件。在该书中,他展示了如何在不使用EJB的情况下构建高质量、可扩展的在线预留座位应用程序。为了构建该应用程序,他写了上万行的基础结构代码。这些代码包含许多可重用的Java接口和类,如ApplicationContext和BeanFactory等。由于Java接口是依赖注入的基本构件,因此他将类的根包命名为“com.interface21”,即这是一个提供给21世纪的参考。根据书中描述,这些代码已经在一些真实的金融系统中被使用。

由于该书影响甚广,当时有几名开发人员(如Juergen Hoeller及Yann Caroff)联系Rod Johnson,希望将com.interface21代码开源。Yann Caroff将这个新框架命名为“Spring”,其含义为,Spring就像一缕春风,扫平传统J2EE的寒冬。所以说,Rod Johnson、Juergen Hoeller及Yann Caroff是Spring框架的共同创建者。

2003年2月,Spring 0.9发布,采用了Apache 2.0开源协议。2004年4月,Spring 1.0发布。截至目前,Spring框架已经是第5个主要版本了。有关Spring 5方面的内容,可以参阅笔者所著的《Spring 5开发大全》。

2.广义上的Spring—Spring技术栈

广义上的Spring是指以Spring框架为核心的Spring技术栈。这些技术栈涵盖了从企业级应用到云计算等各个方面的内容,具体如下。

(1)Spring Data:Spring框架中的数据访问模块对JDBC及ORM提供了很好的支持。随着NoSQL和大数据的兴起,出现了越来越多的新技术,如非关系型数据库、MapReduce框架。Spring Data正是为了让Spring开发者能更方便地使用这些新技术而诞生的,它由一系列小的项目组成,分别为不同的技术提供支持,如Spring Data JPA、Spring Data Hadoop、Spring Data MongoDB、Spring Data Redis等。通过Spring Data,开发者可以用Spring提供的相对一致的方式,访问位于不同类型数据存储中的数据。在本书后续章节中,将会对Spring Data Redis的使用做详细介绍。

(2)Spring Batch:一款专门针对企业级系统中日常批处理任务的轻量级框架,能够帮助开发者方便地开发出高效的批处理应用程序。通过SpringBatch可以轻松构建轻量级的、高效的并口处理应用,并支持事务、并发、流程、监控、纵向和横向扩展,提供统一的接口管理和任务管理。Spring Batch对批处理任务进行了一定的抽象,它的架构大致分为3层,自上而下分别是业务逻辑层、批处理执行环境层和基础设施层。Spring Batch可以很好地利用Spring框架所带来的各种便利,同时也为开发者提供了相对熟悉的开发环境。有关Spring Batch方面的内容,可以参阅笔者所著的《Cloud Native分布式架构原理与实践》。

(3)Spring Security:前身是Acegi,是一款支持定制化的身份验证和访问控制框架。读者如果对该技术感兴趣,可以参阅笔者所著的开源书《Spring Security教程》,以了解更多Spring Security方面的内容。在本书后续章节中,将会对Spring Security的使用做详细介绍。

(4)Spring Boot:指Spring团队提供的全新框架,其设计目的是简化新Spring应用的初始搭建及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot为Spring平台及第三方库提供了“开箱即用”的设置,这样就可以有条不紊地进行应用的开发。多数Spring Boot应用只需要用到很少的Spring配置,其致力于在蓬勃发展的快速应用开发领域成为领导者。读者如果对该技术感兴趣,可以参阅笔者所著的《Spring Boot企业级应用开发实战》及开源书《Spring Boot教程》,以了解更多Spring Boot方面的内容。在本书后续章节中,将会对Spring Boot的使用做详细介绍。

(5)Spring Cloud:使用Spring Cloud,开发人员可以“开箱即用”地实现分布式系统中常用的服务。这些服务可以在任何环境下运行,不仅包括分布式环境,还包括开发人员的笔记本电脑、裸机数据中心,以及Cloud Foundry等托管平台。Spring Cloud基于Spring Boot来进行构建服务,并可以轻松地集成第三方类库来增强应用程序的行为。读者如果对该技术感兴趣,可以参阅笔者所著的《Spring Cloud微服务架构开发实战》及开源书《Spring Cloud教程》,以了解更多Spring Cloud方面的内容。

Spring的技术栈还有很多,如果读者感兴趣,可以访问Spring项目页面(https://spring.io/projects)了解更多信息。

3.约定

由于Spring是早期Spring框架的总称,因此,有时候“Spring”这个命名会给读者带来困扰。本书约定“Spring框架”特指狭义上的Spring,即Spring Framework;而“Spring”特指广义上的Spring,即Spring技术栈。

3.1.2 Spring框架总览

Spring框架是整个Spring技术栈的核心。Spring框架实现了对bean的依赖管理及AOP的编程方式,这些都极大地提升了Java企业级应用开发过程中的编程效率,降低了代码之间的耦合。

Spring框架是很好的一站式构建企业级应用的轻量级解决方案。

1.模块化的Spring框架

Spring框架是模块化的,允许开发人员自由选择需要使用的部分。例如,可以在任何框架上使用IoC容器,也可以只使用Hibernate集成代码或JDBC抽象层。Spring框架支持声明式事务管理,通过RMI或Web服务远程访问用户的逻辑,并支持通过多种选择来持久化用户的数据。它提供了一个全功能的Spring Web MVC及Spring WebFlux框架,同时也支持将AOP集成到软件中。

2.使用Spring框架的好处

Spring框架是一个轻量级的Java平台,能够提供完善的基础设施来支持Java应用程序的开发。Spring负责实现基础设施功能,开发人员可以专注于应用逻辑的开发。Spring可以使用POJO来构建应用程序,并将企业服务非侵入性地应用到POJO。此功能适用于Java SE编程模型和完全或部分的Java EE模型。

作为一个Java应用程序的开发者,可以从Spring平台获得以下好处。

(1)使本地Java方法可以执行数据库事务,而无须自己处理事务API。

(2)使本地Java方法可以执行远程过程,而无须自己处理远程API。

(3)使本地Java方法成为HTTP端点,而无须自己处理Servlet API。

(4)使本地Java方法拥有管理操作,而无须自己处理JMX API。

(5)使本地Java方法可以执行消息处理,而无须自己处理JMS API。

3.1.3 Spring框架常用模块

Spring框架基本涵盖了企业级应用开发的各个方面,它由二十多个模块组成。

1.核心容器

核心容器(Core Container)由spring-core、spring-beans、spring-context、spring-context-support和spring-expression(Spring Expression Language)模块组成。

(1)spring-core模块和spring-beans模块提供框架的基础部分,包括IoC和Dependency Injection功能。BeanFactory是一个复杂工厂模式的实现,无须编程就能实现单例,并允许开发人员将配置和特定的依赖从实际程序逻辑中解耦。

(2)Context(spring-context)模块建立在Core和Beans模块提供的功能之上,它是一种在框架类型下实现对象存储操作的手段,有一点像JNDI注册。Context继承了Beans模块的特性,并且增加了对国际化的支持(如用在资源包中)、事件广播、资源加载和创建上下文(如一个Servlet容器)。Context模块也支持如EJB、JMX和基础远程访问的Java EE特性。ApplicationContext接口是Context模块的主要表现形式。

(3)spring-context-support模块提供了对常见第三方库的支持,以便集成到Spring应用上下文,如缓存(EhCache、JCache)、调度(CommonJ、Quartz)等。

(4)spring-expression模块提供了一种强大的表达式语言,用来在运行时查询和操作对象图。它是作为JSP 2.1规范所指定的统一表达式语言的一种扩展。这种语言支持对属性值、属性参数、方法调用、数组内容存储、收集器和索引、逻辑和算数的操作及命名变量,并且可以通过名称从Spring的控制反转容器中取回对象。表达式语言模块还支持列表投影、列表选择和通用列表聚合。

2.AOP及Instrumentation

spring-aop模块提供AOP(面向切面编程)的实现,从而能够实现方法拦截器和切入点完全分离。使用源码级别元数据的功能,也可以在代码中加入行为信息,在某种程度上类似于.NET属性。

单独的spring-aspects模块提供了集成使用AspectJ框架。spring-instrument模块提供了类似于基础设施的支持。spring-instrument-tomcat用于Tomcat Instrumentation代理。

3.消息

自Spring Framework 4版本开始提供spring-messaging模块,主要包含从Spring Integration项目中抽象出来的,如Message、MessageChannel、MessageHandler模块,以及其他用来提供消息的基础服务。

spring-messaging模块中还包括一组消息映射方法的注解,类似编程模型中Spring MVC的注解。

4.数据访问/集成

数据访问/集成(Data Access/Integration)层由JDBC、事务、ORM、OXM和JMS模块组成。

(1)spring-jdbc模块提供了一个JDBC抽象层,这样开发人员就能避免进行一些烦琐的JDBC编码和解析数据库供应商特定的错误代码。

(2)spring-tx模块用于支持声明式事务管理。

(3)spring-orm模块为流行的对象关系映射API提供集成层,包括JPA和Hibernate。使用spring-orm模块可以将这些O/R映射框架与Spring提供的所有其他功能结合使用,如前面提到的声明式事务管理功能。

(4)spring-oxm模块提供了一个支持Object/XML映射实现的抽象层,如JAXB、Castor、JiBX和XStream。

(5)spring-jms模块包含用于生成和使用消息的功能。从Spring Framework 4.1开始,它提供了与spring-messaging的集成。

5.Web

Web层由spring-web、spring-webmvc、spring-websocket和spring-webflux模块组成。

(1)spring-web模块提供了基本的面向Web开发的集成功能,如文件上传及用于初始化IoC容器的Servlet监听和Web开发应用程序上下文。它也包含对HTTP客户端及Web相关的Spring远程访问的支持。

(2)spring-webmvc模块(Web Servlet模块)包含Spring的MVC功能和Rest服务功能。

(3)spring-websocket模块用于开发基于WebSocket协议通信的程序。

(4)spring-webflux模块是Spring 5中新添加的支持响应式编程的Web开发框架。

6.测试

spring-test模块支持通过组合JUnit或TestNG来实现单元测试和集成测试等功能。它不仅提供Spring ApplicationContexts的持续加载,还能缓存这些上下文,而且提供了可用于孤立测试代码的模拟对象(mock objects)。

3.1.4 Spring设计模式

在Spring框架设计中,广泛使用了设计模式。Spring使用以下设计模式使企业级应用开发变得简单和可测试。

(1)Spring使用POJO模式的强大功能来实现企业应用程序的轻量级和最小侵入性的开发。

(2)Spring使用依赖注入模式(DI模式)实现松耦合,并使系统可以更加面向接口编程。

(3)Spring使用Decorator和Proxy设计模式进行声明式编程。

(4)Spring使用Template设计模式消除样板代码。 8BThahxm4Zar3JpbcRZock4VJF5Qtzx/s1EBv4dyL3N49Cj9xhy83PP1CrTm8DsQ

点击中间区域
呼出菜单
上一章
目录
下一章
×