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 架构演变过程

  1. Servlet + JSP + JavaBean(跳转页面、业务逻辑判断、数据库查询)
  2. MVC 三层架构
    • Web:跳转页面(M Model = POJO(User)、V View = JSP、C Controller = Servlet、new UserService())
    • Service:业务逻辑判断(new UserDao())
    • DAO:数据库查询
  3. 使用 EJB 进行应用的开发,但是 EJB 是重量级框架(在使用的时候,过多的接口和依赖,侵入性强),在使用上比较麻烦(UserService imp extends)
  4. Struts1/Struts2 + Hibernate + Spring(SSH)
    • Web:跳转页面(Struts)
    • Service:业务逻辑判断
    • DAO:数据库查询(Hibernate)
  5. SpringMVC + MyBatis + Spring(SSM)
    • Web:跳转页面(SpringMVC,出现 BUG 使用比较麻烦)
    • Service:业务逻辑判断
    • DAO:数据库查询(MyBatis)
  6. 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。

万丈高楼平地起,首先从最核心模块 Core Container 模块开始讲起。里面包含了 Spring 最核心的功能之一 IoC/DI。


IoC 控制反转

1. IoC 思想

IoC(Inversion of Control,控制反转)是 Spring 框架最核心的思想。简单来说,就是将对象的创建、管理和销毁的控制权从程序员手中交给 Spring 容器来管理。

传统方式 :当我们需要一个对象时,直接通过 new 关键字创建。

java 复制代码
UserService userService = new UserService();

IoC 方式:由 Spring 容器创建对象,我们只需要向容器"要"对象即可。

java 复制代码
@Autowired
private UserService userService;

2. IoC 的好处

  • 降低耦合度:对象之间的依赖关系由容器管理,代码之间不再硬编码
  • 提高可维护性:修改实现类时,不需要修改调用方的代码
  • 便于测试:可以轻松替换为 Mock 对象进行单元测试
  • 统一管理:对象的生命周期由容器统一管理

3. IoC 的两种实现方式

依赖查找(DL)

通过容器提供的 API 主动查找需要的对象。

java 复制代码
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);
依赖注入(DI)

容器在创建对象时,自动将依赖的对象注入到当前对象中。这是 Spring 推荐的方式。


DI 依赖注入

1. 什么是 DI

DI(Dependency Injection,依赖注入)是 IoC 的具体实现方式。当 Spring 容器创建对象时,自动将对象所依赖的其他对象注入给它。

2. 依赖注入的三种方式

构造方法注入
java 复制代码
public class UserService {
    private UserDao userDao;
    
    // 通过构造方法注入
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}

XML 配置:

xml 复制代码
<bean id="userDao" class="com.example.dao.UserDao"/>
<bean id="userService" class="com.example.service.UserService">
    <constructor-arg ref="userDao"/>
</bean>
Setter 方法注入
java 复制代码
public class UserService {
    private UserDao userDao;
    
    // 通过 Setter 方法注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

XML 配置:

xml 复制代码
<bean id="userDao" class="com.example.dao.UserDao"/>
<bean id="userService" class="com.example.service.UserService">
    <property name="userDao" ref="userDao"/>
</bean>
注解注入(最常用)
java 复制代码
@Service
public class UserService {
    @Autowired
    private UserDao userDao;
}

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 配置方式
xml 复制代码
<!-- applicationContext.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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">
    
    <bean id="userDao" class="com.example.dao.UserDao"/>
</beans>
java 复制代码
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = context.getBean("userDao", UserDao.class);
注解配置方式
java 复制代码
@Configuration
@ComponentScan("com.example")
public class SpringConfig {
    // 配置类
}
java 复制代码
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
混合配置方式
java 复制代码
@Configuration
@ImportResource("classpath:applicationContext.xml")
public class SpringConfig {
    
}

Bean 的作用域

Spring 中的 Bean 可以设置不同的作用域,常见的作用域有:

作用域 说明
singleton 单例模式,Spring 默认作用域,整个容器只有一个实例
prototype 原型模式,每次获取都创建新的实例
request 每次 HTTP 请求创建一个实例(仅 Web 应用)
session 每个 HTTP Session 创建一个实例(仅 Web 应用)
application 每个 ServletContext 创建一个实例(仅 Web 应用)

设置作用域

java 复制代码
@Component
@Scope("prototype")  // 设置为原型模式
public class UserService {
    
}

XML 配置方式:

xml 复制代码
<bean id="userService" class="com.example.service.UserService" scope="prototype"/>

Bean 的生命周期

Spring 容器管理 Bean 的完整生命周期,大致分为以下几个阶段:

  1. 实例化:通过构造方法创建 Bean 实例
  2. 属性赋值:为 Bean 的属性注入值
  3. 初始化前 :调用 BeanPostProcessorpostProcessBeforeInitialization 方法
  4. 初始化 :执行初始化方法(@PostConstruct 或配置的 init-method
  5. 初始化后 :调用 BeanPostProcessorpostProcessAfterInitialization 方法
  6. 使用:Bean 准备就绪,可以被使用
  7. 销毁 :容器关闭时,执行销毁方法(@PreDestroy 或配置的 destroy-method

生命周期示例

java 复制代码
@Component
public class UserService {
    
    public UserService() {
        System.out.println("1. 实例化");
    }
    
    @Autowired
    private UserDao userDao;
    
    @PostConstruct
    public void init() {
        System.out.println("3. 初始化方法");
    }
    
    public void doSomething() {
        System.out.println("4. 使用 Bean");
    }
    
    @PreDestroy
    public void destroy() {
        System.out.println("5. 销毁方法");
    }
}

总结

本文从框架的概念入手,详细介绍了 Spring 框架的发展历程、核心思想和基本使用。Spring 框架的核心是 IoC(控制反转)和 DI(依赖注入),通过将对象的创建和管理交给 Spring 容器,大大降低了代码之间的耦合度,提高了项目的可维护性和可测试性。

学习 Spring 框架的关键在于理解 IoC/DI 的思想,掌握 Bean 的配置方式、作用域和生命周期。在此基础上,可以进一步学习 Spring AOP、Spring MVC、Spring Boot 等更高级的内容。

Spring 框架作为 Java 生态中最核心的框架之一,掌握它将为你的 Java 开发之路打下坚实的基础。希望本文能帮助你快速入门 Spring 框架,开启 Spring 学习之旅!

相关推荐
糖果店的幽灵1 小时前
LangChain 1.3 完全教程:从入门到精通-Part 7: Documents(文档处理)
java·python·langchain
Java_2017_csdn1 小时前
Java 策略模式(Strategy Pattern)-(三)
java·开发语言·servlet
颜进强1 小时前
Claude Code -16 文件引用与加载机制完整实践:从 CLAUDE.md 到 Skills 与 Subagents
前端·后端·ai编程
闪闪发光得欧1 小时前
agent工作模式之ReAct实战
后端
许彰午1 小时前
06_Java面向对象入门
java·开发语言·python
Java_2017_csdn1 小时前
Java 策略模式(Strategy Pattern)-(二)
java·开发语言·策略模式
摇滚侠1 小时前
CSDN AI 数字营销测评 营销组件
java
爱折腾的程序员1 小时前
Java 8 Stream 流常用操作:从入门到原理
后端
Java_2017_csdn1 小时前
Java 策略模式(Strategy Pattern)-(一)
java·开发语言·策略模式