Spring框架:介绍和快速入门
什么是框架
框架就好比房子的框架,它提供了建造房屋所需的基本结构和规范。开发者可以在这个框架上搭建自己的应用,就像在一座已经搭好基础的房子里进行装修,省去了从零开始建房的繁琐工作,这样你能更快地完成项目,因为很多基础工作已经被框架搞定了。
- 框架 = 毛坯房
- 不用框架 = 一砖一瓦去盖房子
- 几个框架一起用 = 架构(SSM)
为什么要学 Spring 框架
Spring 使每个人都可以更快、更轻松、更安全地进行 Java 编程。Spring 对速度、简单性和生产力的关注使其成为世界上最受欢迎的 Java 框架。
1. 为什么要学习 Spring 6
Spring 作为 Java 程序员必会武功,无论是 Spring 的哪个版本,至少需要会一个版本。既然我们怎么都要学习 Spring,为什么不学习最新版的 Spring 6 呢?
Spring 6 最低支持 JDK 17,Spring 6 会把 JDK 17 的特性体现得淋漓尽致。Spring 5 最低支持 JDK 8,而 Spring 6 最低支持 JDK 17,直接把 JDK 9~16 全跳过去了(Spring 5 支持 JDK 8、9)。JDK 17 也是 Java 目前最新的一个长期支持版。可想而知在 Spring 6 会把 JDK 17 的特性体现得淋漓尽致。
还有一个原因:Spring 产品一直紧跟,甚至引领 Java 行业潮流发展方向。通过学习最新的 Spring 6,可以洞悉出 Java 未来的趋势,这点还是非常重要的。
什么是 Spring
Spring 有很多含义,Spring 本身是一个生态体系(全家桶),它们都建立在 Spring 框架之上。大多数情况下,通常我们说Spring = Spring 框架。
Java Web 架构演变过程
- Servlet + JSP + JavaBean(跳转页面、业务逻辑判断、数据库查询)
- MVC 三层架构
- Web:跳转页面(M Model = POJO(User)、V View = JSP、C Controller = Servlet、new UserService())
- Service:业务逻辑判断(new UserDao())
- DAO:数据库查询
- 使用 EJB 进行应用的开发,但是 EJB 是重量级框架(在使用的时候,过多的接口和依赖,侵入性强),在使用上比较麻烦(UserService imp extends)
- Struts1/Struts2 + Hibernate + Spring(SSH)
- Web:跳转页面(Struts)
- Service:业务逻辑判断
- DAO:数据库查询(Hibernate)
- SpringMVC + MyBatis + Spring(SSM)
- Web:跳转页面(SpringMVC,出现 BUG 使用比较麻烦)
- Service:业务逻辑判断
- DAO:数据库查询(MyBatis)
- SpringBoot 开发,约定大于配置(SSM 搭建架构需要大量 XML 配置文件)
Spring 发展历程
Spring Framework 前身是 interface21,由 Rod Johnson 于 2002 年研发,2003 年上线第一个版本。Spring 框架之父 Rod Johnson(罗宾·约翰逊,悉尼大学计算机硕士,音乐博士),他的《轮子理论》是 Spring 框架的宗旨,也是 Spring 框架能够被其他人接受的原因。
轮子理论:不要重复地创造轮子。这里面的轮子就是汽车的轮子,告诉我们已经生产过的轮子就拿过来用,没必要重复生产多余的轮子。
轮子理论放在 Spring 框架上:我们 Spring 框架不发明新的技术,我们只是让已经有的技术使用起来更加简单(整个 Spring 框架最重要的一句话,Spring 框架的作用到底是干什么的)。乍一看这句话没问题,但细品能发现 Rod Johnson 是个纯老六。说 Spring 框架不发明新的技术,是告诉别的公司,我们不抢你们的生意,来用我,我还能让你们的技术用起来更加方便。但实际上:
- MVC 框架:曾经 Apache 爆火的 Struts1 和 Struts2 都被 Spring MVC 给干掉了,近几年 Spring 自己又出了 WebFlux 自己要干自己。
- 数据访问层框架:曾经的 Hibernate 目前被 MyBatis 干掉了。Spring 团队出了 Spring Data 一直在和 MyBatis 竞争。
虽然现在可以直接通过 SpringBoot 来开发,但是 SpringBoot 也是基于 Spring 的,所以学 SpringBoot 也要从 Spring 开始。
重要时间线
- 2009 年:VMware 收购了 Spring
- 2013 年 4 月:由 EMC(美国信息存储资讯科技公司)、VMware(虚拟化的鼻祖)和 GE(美国通用电气公司)合资成立了 Pivotal 公司(美国毕威拓),主做云原生平台。VMware 将 Spring 拆分给了 Pivotal 公司。
EMC、VMWare、Spring 之间有着一大段相爱相杀的故事,中间还有第三者戴尔公司插足的情况,如果细说起来可以拍一部商业大片了。比较重要的时间线如下:
- 2020 年 1 月 3 日:VMware 宣布完成对 Pivotal 的收购,至此 Pivotal 成为 VMWare 的全资子公司。交易价格约 27 亿美元。按照现在的汇率计算,大约 188 个小目标。收购完成后 Spring 框架的 Logo 也进行了改变。从图片可以看到 Spring By Pivotal 变成了 Spring by VMware Tanzu。其中 VMWare Tanzu 是戴尔科技旗下 VMware 最新推出的云原生系列产品家族名称。
Spring Framework 主版本发布时间
到文档制作时,Spring 框架最新版为 6.0.6,所以本套课程就以 Spring Framework 6.0.6 版本进行讲解。
Spring Framework 各个版本重大变化
那就不能只说 Spring Framework 5 和 Spring Framework 6 的区别,这样弄的好像同学们之前学习过 Spring Framework 5 一样。所以有必要来说一说 Spring 从 1.X 版本到 6.X 版本的重大变化,这样才能深刻地感受到 Spring Framework 的发展变化。
| 版本 | 版本特性 |
|---|---|
| Spring Framework 1.0 | 1、所有代码都在一个项目中 2、支持核心功能 IOC、AOP 3、内置支持 Hibernate、iBatic 等第三方框架 4、对第三方技术简单封装,如:JDBC、Mail、事务等 5、只支持 XML 配置方式 |
| Spring Framework 2.0 | 1、最重要的变化:支持注解配置 2、增加对 ehcache 支持 3、对 JMS(Java 消息服务)、JMX(Java 管理扩展)等支持 |
| Spring Framework 3.0 | 1、支持 Java 类的配置 2、由原来的一个项目拆分成多个子模块 3、添加单元测试子模块 |
| Spring Framework 4.0 | 1、全面支持 Java 8 2、添加二级子项目 Spring MVC,基于 Servlet 3.0 开发 3、提供 WebSocket 支持 4、引入 @RestController 等注解,增强对 Restful 的支持 |
| Spring Framework 5.0 | 1、最低环境要求 Java 8 2、日志整合。把原来 commons-logging 封装后变为 spring-jcl 模块 3、跨域更改。原来的 JSONP 支持变更为修改响应头的 @CrossOrigin 注解 4、响应式编程。添加二级子项目 WebFlux 5、使用 Kotlin(科特林)进行函数式编程 |
| Spring Framework 6.0 | 1、最低环境要求 Java 17 2、加强对响应式编程支持。添加子模块 spring-r2dbc 3、取消子模块 spring-orm-hibernate4,只保留 spring-orm,只支持 Hibernate5 |
Spring Framework 5 和 6 次版本支持时间
Spring 框架介绍
Spring 框架英文全称 Spring Framework,是由 Spring 团队研发的模块化、轻量级开源框架。其主要目的是为了简化项目开发。在项目开发中,可以说没有刻意使用 Spring,却处处有着 Spring 存在。用官网对 Spring 框架的介绍:Spring 框架核心功能包含依赖注入、事务管理、Web 应用、数据访问、消息发送等等。
Spring Framework 6 包含的模块
Spring 从 6.0 版本开始把一个项目拆分成多个项目。到目前的 Spring Framework 6 版本,共计分为 20 个子模块。
Test
对应spring-test.jar。Spring 提供的测试工具,可以整合 JUnit 测试或 TestNG,简化测试环节。
Core Container
Spring 的核心组件,包含了 Spring 框架最基本的支撑。
- Beans:对应
spring-beans.jar,Spring 进行对象管理时依赖的 jar 包。 - Core:对应
spring-core.jar,Spring 核心 jar 包,很多基础核心类都在这个包中。 - Context:对应
spring-context.jar,Spring 容器上下文对象。除了包含容器类型,很多第三方支持的内容都在这个模块中。 - Expression:对应
spring-expression.jar,Spring 表达式语言。可以通过表达式快速获取容器内容。 - JCL:对应
spring-jcl.jar,Spring 日志。从 Spring 老版本要求使用commons-logging.jar,从 Spring 5.x 开始,自己对 commons-logging 做了封装。
AOP
面向切面编程,对应spring-aop.jar。
Aspects
AspectJ 的具体实现,面向切面编程的另一种实现。对应spring-aspects.jar。
Instrumentation
服务器代理接口的具体实现。对应spring-instrument.jar。
Messaging
集成 messaging api 和消息协议提供支持。对应spring-messaging.jar。
Data Access / Integration
Spring 对数据访问层的封装。
- JDBC:对应
spring-jdbc.jar,Spring 对 JDBC 的封装,当需要使用 Spring 连接数据库时使用。spring-jdbc.jar需要依赖spring-tx.jar。 - Transactions:对应
spring-tx.jar,事务管理。 - ORM:对应
spring-orm.jar,Spring 整合第三方 ORM 框架需要使用的 jar 包,例如 Hibernate 框架。 - OXM:对应
spring-oxm.jar,Spring 对 XML 序列化实现,本质是对 Marshalling XML 的支持。 - R2DBC:对应
spring-r2dbc.jar,对数据库响应式编程的支持。 - JMS:对应
spring-jms.jar,Spring 提供对 JMS 的框架。
Web
Spring 对 javax 下的接口或类做的扩展功能。
- web:对应
spring-web.jar,Spring 框架在 Java Web 项目使用时必须的包。 - webmvc:对应
spring-webmvc.jar,实际上就是 SpringMVC 框架。 - webflux:对应
spring-webflux.jar,和 Spring MVC 类似,但是是目前比较流行的响应式编程。 - websocket:对应
spring-websocket.jar,Spring 对 WebSocket 的支持。
学习 Spring 其实就是在分别学习 Spring 所有模块的功能。随着 Spring 框架的不断发展,在 Spring 官方压缩包中包含的模块对应的 jar 也越来越多。
如果希望下载官方压缩包,查看所有 jar 包,可以通过下面链接下载。在 Maven 项目中,不需要单独下载下面内容。
友情提示:Spring 6 目前只有源码,没有官方打包的 dist。5.x 和之前的版本都可以下载到官方打包的 dist。
- 链接地址:https://github.com/spring-projects/spring-framework/tags
- 链接地址:https://repo.spring.io/libs-release-local/org/springframework/spring/
万丈高楼平地起,首先从最核心模块 Core Container 模块开始讲起。里面包含了 Spring 最核心的功能之一 IoC/DI。
IoC 控制反转
1. IoC 思想
IoC(Inversion of Control,控制反转)是 Spring 框架最核心的思想。简单来说,就是将对象的创建、管理和销毁的控制权从程序员手中交给 Spring 容器来管理。
传统方式:当我们需要一个对象时,直接通过new关键字创建。
UserServiceuserService=newUserService();IoC 方式:由 Spring 容器创建对象,我们只需要向容器"要"对象即可。
@AutowiredprivateUserServiceuserService;2. IoC 的好处
- 降低耦合度:对象之间的依赖关系由容器管理,代码之间不再硬编码
- 提高可维护性:修改实现类时,不需要修改调用方的代码
- 便于测试:可以轻松替换为 Mock 对象进行单元测试
- 统一管理:对象的生命周期由容器统一管理
3. IoC 的两种实现方式
依赖查找(DL)
通过容器提供的 API 主动查找需要的对象。
ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");UserServiceuserService=context.getBean("userService",UserService.class);依赖注入(DI)
容器在创建对象时,自动将依赖的对象注入到当前对象中。这是 Spring 推荐的方式。
DI 依赖注入
1. 什么是 DI
DI(Dependency Injection,依赖注入)是 IoC 的具体实现方式。当 Spring 容器创建对象时,自动将对象所依赖的其他对象注入给它。
2. 依赖注入的三种方式
构造方法注入
publicclassUserService{privateUserDaouserDao;// 通过构造方法注入publicUserService(UserDaouserDao){this.userDao=userDao;}}XML 配置:
<beanid="userDao"class="com.example.dao.UserDao"/><beanid="userService"class="com.example.service.UserService"><constructor-argref="userDao"/></bean>Setter 方法注入
publicclassUserService{privateUserDaouserDao;// 通过 Setter 方法注入publicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}}XML 配置:
<beanid="userDao"class="com.example.dao.UserDao"/><beanid="userService"class="com.example.service.UserService"><propertyname="userDao"ref="userDao"/></bean>注解注入(最常用)
@ServicepublicclassUserService{@AutowiredprivateUserDaouserDao;}3. 常用注入注解
| 注解 | 说明 |
|---|---|
@Autowired | 按类型自动装配,Spring 官方推荐 |
@Resource | 按名称自动装配,JDK 提供的注解 |
@Inject | 和 @Autowired 类似,需要额外引入依赖 |
@Qualifier | 配合 @Autowired 使用,指定具体 Bean 名称 |
Spring 容器
1. 什么是 Spring 容器
Spring 容器是 Spring 框架的核心,负责创建、配置和管理 Bean 对象。常见的容器实现有:
- BeanFactory:Spring 最基础的容器,提供基本的 IoC 功能
- ApplicationContext:BeanFactory 的子接口,功能更强大,企业级开发中常用
2. ApplicationContext 的常见实现类
| 实现类 | 说明 |
|---|---|
ClassPathXmlApplicationContext | 从类路径加载 XML 配置文件 |
FileSystemXmlApplicationContext | 从文件系统加载 XML 配置文件 |
AnnotationConfigApplicationContext | 基于注解配置的容器 |
WebApplicationContext | 专为 Web 应用设计的容器 |
3. 容器的创建方式
XML 配置方式
<!-- applicationContext.xml --><?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><beanid="userDao"class="com.example.dao.UserDao"/></beans>ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");UserDaouserDao=context.getBean("userDao",UserDao.class);注解配置方式
@Configuration@ComponentScan("com.example")publicclassSpringConfig{// 配置类}ApplicationContextcontext=newAnnotationConfigApplicationContext(SpringConfig.class);混合配置方式
@Configuration@ImportResource("classpath:applicationContext.xml")publicclassSpringConfig{}Bean 的作用域
Spring 中的 Bean 可以设置不同的作用域,常见的作用域有:
| 作用域 | 说明 |
|---|---|
singleton | 单例模式,Spring 默认作用域,整个容器只有一个实例 |
prototype | 原型模式,每次获取都创建新的实例 |
request | 每次 HTTP 请求创建一个实例(仅 Web 应用) |
session | 每个 HTTP Session 创建一个实例(仅 Web 应用) |
application | 每个 ServletContext 创建一个实例(仅 Web 应用) |
设置作用域
@Component@Scope("prototype")// 设置为原型模式publicclassUserService{}XML 配置方式:
<beanid="userService"class="com.example.service.UserService"scope="prototype"/>Bean 的生命周期
Spring 容器管理 Bean 的完整生命周期,大致分为以下几个阶段:
- 实例化:通过构造方法创建 Bean 实例
- 属性赋值:为 Bean 的属性注入值
- 初始化前:调用
BeanPostProcessor的postProcessBeforeInitialization方法 - 初始化:执行初始化方法(
@PostConstruct或配置的init-method) - 初始化后:调用
BeanPostProcessor的postProcessAfterInitialization方法 - 使用:Bean 准备就绪,可以被使用
- 销毁:容器关闭时,执行销毁方法(
@PreDestroy或配置的destroy-method)
生命周期示例
@ComponentpublicclassUserService{publicUserService(){System.out.println("1. 实例化");}@AutowiredprivateUserDaouserDao;@PostConstructpublicvoidinit(){System.out.println("3. 初始化方法");}publicvoiddoSomething(){System.out.println("4. 使用 Bean");}@PreDestroypublicvoiddestroy(){System.out.println("5. 销毁方法");}}总结
本文从框架的概念入手,详细介绍了 Spring 框架的发展历程、核心思想和基本使用。Spring 框架的核心是 IoC(控制反转)和 DI(依赖注入),通过将对象的创建和管理交给 Spring 容器,大大降低了代码之间的耦合度,提高了项目的可维护性和可测试性。
学习 Spring 框架的关键在于理解 IoC/DI 的思想,掌握 Bean 的配置方式、作用域和生命周期。在此基础上,可以进一步学习 Spring AOP、Spring MVC、Spring Boot 等更高级的内容。
Spring 框架作为 Java 生态中最核心的框架之一,掌握它将为你的 Java 开发之路打下坚实的基础。希望本文能帮助你快速入门 Spring 框架,开启 Spring 学习之旅!
