第六章 初识Spring框架
6.1 Spring介绍
6.1.1 Spring概述
早期Java EE规范较为复杂,其中EJB标准设计存在缺陷,导致开发复杂,代码侵入性强,部署测试困难。
因此,Spring于2003年诞生。Spring是一个轻量级的一站式Java SE/EE开源框架,最核心的理念是控制反转和面向切面编程。其中,控制反转是Spring的基础,支持Java Bean管理;面向切面编程是Spring的重要特性,可以在运行期间动态代理,为程序添加功能。
Spring涵盖了表现层、业务逻辑层和持久层,提供了SpringMVC框架、事务管理、日志记录、整合MyBatis、Hibernate等技术。尽管Spring贯穿于各个层,但它不是为了取代已有框架,而是为了与它们进行无缝整合,具有高度的开放性。
6.1.2 Spring框架的优点
Spring框架有以下优点:
- 非侵入式设计:Spring框架不会强制要求开发者使用特定的类继承关系或接口,这使得开发者可以更自由地使用其他Java技术,并且避免了对原有代码的侵入。
在软件开发中,非侵入式(non-invasive)指的是一个框架或库的使用方式不需要对应用程序做出大量的修改或扩展。相反,应用程序可以通过配置或者编写少量代码来使用该框架或库。
举个生活中的例子,假设你想要更换你家的电视机,你可以选择购买一台新的电视机来替换旧的,这种方式就是“侵入式”的。而另一种方式是使用一个支架来安装一个投影仪,这样你就可以将电视节目投射到墙上观看,而不必更换电视机。这种方式就是“非侵入式”的,因为它不需要对原有的家庭设备做出大量修改或扩展,而是通过一个小的组件来实现目标。同样的,Spring框架也提供了一种非侵入式的方式来管理应用程序的组件。
-
降低耦合性,方便开发:Spring框架通过控制反转(IoC)和依赖注入(DI)实现了组件之间的松散耦合,使得组件之间的关系更加简单、清晰,并且易于维护和测试。
-
支持AOP编程:Spring框架支持面向切面编程(AOP),这使得开发者可以方便地在不修改源代码的情况下,为程序统一添加功能。
-
支持声明式事务:Spring框架提供了声明式事务管理的支持,使得开发者可以更方便地管理事务,从而减少了代码的重复和复杂度。
-
方便程序的测试:Spring框架提供了基于Junit的单元测试支持,并且通过依赖注入,可以很方便地模拟和测试不同的对象和组件。
-
方便集成各种优秀框架:Spring框架通过提供各种模板和API,使得开发者可以很方便地集成其他优秀的框架和技术,如Hibernate、MyBatis等。
-
降低JAVAEE API的使用难度:Spring框架通过对JAVAEE API的封装和简化,使得开发者可以更加简单、方便地使用各种JAVAEE API。
6.1.3 Spring的体系结构
Spring是模块化的,可以只选用想用的模块。体系结构图:
Spring 主要分为八大模块,其中,绿色背景的模块是 Spring 的主要模块,也是本书重点讲解的模块,下面对这些模块进行简单介绍。
1. 核心容器(Core Container)
核心容器模块在Spring的功能体系中起着支撑作用,是其他模块的基石。
-
Beans模块:该模块提供了创建和管理Bean对象的功能,其中BeanFactory类是工厂模式的经典实现。Beans模块的主要作用是管理Bean对象的生命周期,并提供了一系列接口和类用于支持Bean的创建、销毁、后置处理等操作。
-
Core模块:该模块提供了Spring框架的基本组成部分,包括IoC和DI功能。IoC(Inversion of Control)是一种设计模式,通过将对象的创建和依赖关系的管理委托给容器来实现对象的解耦和灵活的配置方式。而DI(Dependency Injection)则是IoC的具体实现方式,它通过容器将Bean的依赖关系注入到Bean中,从而实现对象的解耦和灵活的配置方式。
-
Context模块:该模块构建于Beans模块和Core模块的基础上,它可以通过ApplicationContext接口提供上下文信息。ApplicationContext是Spring IoC容器的具体实现,它提供了一系列功能,包括Bean的生命周期管理、资源管理、国际化支持、事件机制等。Context模块还提供了一些特殊的ApplicationContext实现,如WebApplicationContext和AnnotationConfigApplicationContext等。
-
SpEL模块:该模块是Spring3.0后新增的模块,它提供了对SpEL(Spring Expression Language)的支持。SpEL是一个在程序运行时支持操作对象图的表达式语言,可以用于在配置文件中引用Bean、访问Bean的属性、调用Bean的方法等。SpEL还提供了一些特殊的表达式,如条件表达式、正则表达式、集合投影等,可以帮助开发者更灵活地配置和管理Bean对象。
2.数据访问及集成(Data Access/Integration)
数据访问及集成模块用于访问和操作数据库中的数据,它主要包含JDBC模块、ORM模块、OXM模块、JMS模块和Transactions模块。
-
JDBC模块:该模块提供了一个JDBC的抽象层,可以消除长的JDBC编码并能够解析数据库供应商特有的错误代码。它还提供了一些实用工具类和接口,如JdbcTemplate和DataSource等,用于简化JDBC编程。
-
ORM模块:该模块为主流的对象关系映射API提供了集成层,用于集成主流的对象关系映射框架,如MyBatis、Hibernate和JDO等。ORM模块还提供了一些实用工具类和接口,如HibernateTemplate和JpaTemplate等,用于简化ORM编程。
-
OXM模块:该模块提供了对XML映射的抽象层的支持,如JAXB、Castor、XML Beans、JiBX和XStream等。它还提供了一些实用工具类和接口,如Marshaller和Unmarshaller等,用于简化XML编程。
-
JMS模块:该模块主要用于传递消息,包含消息的生产和消费。自Spring4.1版本后,JMS模块支持与Spring message模块的集成,可以更方便地使用消息驱动的应用程序。
-
Transactions模块:该模块的主要功能是事务管理,它支持Spring自动处理的声明式事务,可以通过注解或XML配置来声明事务。Transactions模块还提供了一些实用工具类和接口,如TransactionTemplate和TransactionManager等,用于简化事务编程。
3.Web
Web模块是Spring框架中的重要组成部分,它的实现基于ApplicationContext,提供了Web应用的各种工具类,包括WebSocket模块、Servlet模块、Web模块和Portlet模块。下面是对每个模块的介绍和功能分点说明:
-
WebSocket模块:该模块是Spring4.0以后新增的模块,它提供了WebSocket和SockJS的实现,以及对STOMP的支持。WebSocket是一种基于TCP协议的全双工通信协议,可以在浏览器和服务器之间建立持久性连接,用于实时通信和数据传输。
-
Servlet模块:该模块提供了Spring的模型、视图、控制器,以及Web应用程序的REST Web服务实现。它还提供了一些实用工具类和接口,如DispatcherServlet和HandlerMapping等,用于简化Web应用程序的开发和维护。
-
Web模块:该模块提供了针对Web开发的集成特性,如大部分文件上传功能等。此外,Web模块还包含一个HTTP客户端和Spring远程处理支持的Web相关部分。它还提供了一些实用工具类和接口,如WebMvcConfigurer和WebApplicationContext等,用于简化Web应用程序的配置和管理。
-
Portlet模块:该模块提供了对Portlet规范的支持,可以将Spring应用程序部署为Portlet应用程序。它还提供了一些实用工具类和接口,如PortletContext和PortletRequest等,用于简化Portlet应用程序的开发和维护。
4. 其他模块
Spring框架还有其他几个重要的模块,包括AOP模块、Aspects模块、Instrumentation模块、Messaging模块和Test模块。下面是对每个模块的介绍和功能分点说明:
-
AOP模块:该模块提供了对面向切面编程的支持,程序可以定义方法拦截器和切人点,将代码按照功能进行分离,以降低程序的耦合性。AOP模块可以与其他Spring模块和第三方库进行集成,可以用来实现日志记录、性能监控、事务管理等功能。
-
Aspects模块:该模块提供了与AspectJ集成的支持,AspectJ是一个功能强大且成熟的AOP框架,为面向切面编程提供了多种实现方法。Aspects模块可以用于实现复杂的切面需求,如异常处理、缓存、安全性等。
-
Instrumentation模块:该模块提供了对类工具的支持,并且实现了类加载器,该模块可以在特定的应用服务器中使用。Instrumentation模块可以用于对Java应用程序进行监控和调试,例如对类加载过程进行增强和修改。
-
Messaging模块:该模块是Spring4.0以后新增的模块,它提供了对消息传递体系结构和协议的支持。Messaging模块可以用于实现异步消息通信、事件驱动架构等应用场景。
-
Test模块:该模块提供了对程序单元测试和集成测试的支持。Test模块可以自动化测试Spring应用程序,包括依赖注入、AOP、事务管理等方面的测试。Test模块还提供了一些实用工具类和接口,如MockMvc和TestRestTemplate等,用于简化测试代码的编写和管理。
6.1.4 Spring 5的新特性
Spring 5 是 Spring 框架的最新版本,相比于旧版本,它对核心框架进行了修订和更新,引入了很多新特性。其中,主要体现在以下几个方面:
-
更新 JDK 基线:Spring 5 运行于 JDK 8 之上,因此要求 JDK 最低版本为 8,这促进了 Spring 开发者积极运用 Java 8 的新特性。
-
修订核心框架:Spring 5 利用 JDK 8 的新特性进行自身功能的修订,包括反射增强、基于 JDK 8 的默认方法构建的选择性声明、@Nullable 和 @NotNull 注解等。
-
更新核心容器:Spring 5 支持候选组件索引作为类路径扫描的替代方案,从而缩减了 Spring 程序的启动时间。
-
支持响应式编程:Spring 5 包含了响应流和 Reactor 的实现,以及对 ReactiveStream 的 Java 实现 IReactor 的支持,这使得 Spring 更加灵活,能够构建对事件做出响应的应用程序。
-
支持函数式 Web 框架:Spring 5 提供了一个函数式 Web 框架,使用函数式编程风格来定义端点,引入了 HandlerFunction 和 RouterFunction 两个基本组件。
-
支持 Kotlin:Spring 5 对 Kotlin 语言进行了支持,这拓宽了 Spring 的应用领域,让开发人员可以进行深度的函数式编程。
-
提升测试功能:Spring 5 完全支持 JUnit 5 Jupiter,同时提供了在 SpringTestContext Framework 中进行并行测试的扩展,针对响应式编程模型,引入了支持 Spring WebFlux 的 WebTestClient 集成测试。
6.1.5 Spring的下载及目录结构
Spring Framework 是一个开源的 Java 应用程序框架,可以通过官方网站进行下载。
下载页面提供了多个版本的 Spring Framework,开发者可以根据自己的需求选择合适的版本进行下载,同时也可以下载相关的依赖库等。
Spring Framework 的目录结构主要包含以下几个部分:
-
bin:包含可执行文件,如 spring.bat、spring.sh 等。
-
conf:包含配置文件,如 spring.xml、spring.properties 等。
-
docs:包含 API 文档及其他文档。
-
lib:包含 Spring Framework 的所有依赖库及其他必要的 JAR 包,如 spring-core.jar、spring-webmvc.jar 等。
-
samples:包含 Spring Framework 的示例应用程序及示例代码。
-
src:包含 Spring Framework 的源代码。
-
dist:包含编译好的 Spring Framework 发布版本。
在使用 Spring Framework 时,一般只需要引入相应的 JAR 包即可,而不需要手动复制或管理目录结构。
6.2 Spring的入门程序
前面学习了Spring的基础知识,下面通过一个简单的人门程序演示 Spring架的使用,该人门程序要求在控制台打印“张三:欢迎来到Spring”,具体实现步骤如下。
1. 创建 Maven 项目
在 IDEA 中创建一个名称为 chapter06 的 Maven 项目,可以选择使用 IDE 提供的 Maven 项目模板来创建。
2. 配置 pom.xml 文件
在项目的 pom.xml 文件中添加 Spring 的依赖,包括 spring-core、spring-beans、spring-context、spring-expression 和 commons-logging 等依赖包。可以直接复制下面的依赖配置到 pom.xml 文件中:
<dependencies>
<!-- Spring的核心依赖包,包含Spring框架的基础功能 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- Spring的bean依赖包,包含Spring框架的IoC和DI功能 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- Spring的上下文依赖包,包含Spring框架的上下文(Context)功能 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE