Spring框架:介绍和快速入门
什么是框架框架就好比房子的框架它提供了建造房屋所需的基本结构和规范。开发者可以在这个框架上搭建自己的应用就像在一座已经搭好基础的房子里进行装修省去了从零开始建房的繁琐工作这样你能更快地完成项目因为很多基础工作已经被框架搞定了。框架 毛坯房不用框架 一砖一瓦去盖房子几个框架一起用 架构SSM为什么要学 Spring 框架Spring 使每个人都可以更快、更轻松、更安全地进行 Java 编程。Spring 对速度、简单性和生产力的关注使其成为世界上最受欢迎的 Java 框架。1. 为什么要学习 Spring 6Spring 作为 Java 程序员必会武功无论是 Spring 的哪个版本至少需要会一个版本。既然我们怎么都要学习 Spring为什么不学习最新版的 Spring 6 呢Spring 6 最低支持 JDK 17Spring 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 未来的趋势这点还是非常重要的。什么是 SpringSpring 有很多含义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 extendsStruts1/Struts2 Hibernate SpringSSHWeb跳转页面StrutsService业务逻辑判断DAO数据库查询HibernateSpringMVC MyBatis SpringSSMWeb跳转页面SpringMVC出现 BUG 使用比较麻烦Service业务逻辑判断DAO数据库查询MyBatisSpringBoot 开发约定大于配置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 收购了 Spring2013 年 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.01、所有代码都在一个项目中2、支持核心功能 IOC、AOP3、内置支持 Hibernate、iBatic 等第三方框架4、对第三方技术简单封装如JDBC、Mail、事务等5、只支持 XML 配置方式Spring Framework 2.01、最重要的变化支持注解配置2、增加对 ehcache 支持3、对 JMSJava 消息服务、JMXJava 管理扩展等支持Spring Framework 3.01、支持 Java 类的配置2、由原来的一个项目拆分成多个子模块3、添加单元测试子模块Spring Framework 4.01、全面支持 Java 82、添加二级子项目 Spring MVC基于 Servlet 3.0 开发3、提供 WebSocket 支持4、引入 RestController 等注解增强对 Restful 的支持Spring Framework 5.01、最低环境要求 Java 82、日志整合。把原来 commons-logging 封装后变为 spring-jcl 模块3、跨域更改。原来的 JSONP 支持变更为修改响应头的 CrossOrigin 注解4、响应式编程。添加二级子项目 WebFlux5、使用 Kotlin科特林进行函数式编程Spring Framework 6.01、最低环境要求 Java 172、加强对响应式编程支持。添加子模块 spring-r2dbc3、取消子模块 spring-orm-hibernate4只保留 spring-orm只支持 Hibernate5Spring 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 ContainerSpring 的核心组件包含了 Spring 框架最基本的支撑。Beans对应spring-beans.jarSpring 进行对象管理时依赖的 jar 包。Core对应spring-core.jarSpring 核心 jar 包很多基础核心类都在这个包中。Context对应spring-context.jarSpring 容器上下文对象。除了包含容器类型很多第三方支持的内容都在这个模块中。Expression对应spring-expression.jarSpring 表达式语言。可以通过表达式快速获取容器内容。JCL对应spring-jcl.jarSpring 日志。从 Spring 老版本要求使用commons-logging.jar从 Spring 5.x 开始自己对 commons-logging 做了封装。AOP面向切面编程对应spring-aop.jar。AspectsAspectJ 的具体实现面向切面编程的另一种实现。对应spring-aspects.jar。Instrumentation服务器代理接口的具体实现。对应spring-instrument.jar。Messaging集成 messaging api 和消息协议提供支持。对应spring-messaging.jar。Data Access / IntegrationSpring 对数据访问层的封装。JDBC对应spring-jdbc.jarSpring 对 JDBC 的封装当需要使用 Spring 连接数据库时使用。spring-jdbc.jar需要依赖spring-tx.jar。Transactions对应spring-tx.jar事务管理。ORM对应spring-orm.jarSpring 整合第三方 ORM 框架需要使用的 jar 包例如 Hibernate 框架。OXM对应spring-oxm.jarSpring 对 XML 序列化实现本质是对 Marshalling XML 的支持。R2DBC对应spring-r2dbc.jar对数据库响应式编程的支持。JMS对应spring-jms.jarSpring 提供对 JMS 的框架。WebSpring 对 javax 下的接口或类做的扩展功能。web对应spring-web.jarSpring 框架在 Java Web 项目使用时必须的包。webmvc对应spring-webmvc.jar实际上就是 SpringMVC 框架。webflux对应spring-webflux.jar和 Spring MVC 类似但是是目前比较流行的响应式编程。websocket对应spring-websocket.jarSpring 对 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 思想IoCInversion of Control控制反转是 Spring 框架最核心的思想。简单来说就是将对象的创建、管理和销毁的控制权从程序员手中交给 Spring 容器来管理。传统方式当我们需要一个对象时直接通过new关键字创建。UserServiceuserServicenewUserService();IoC 方式由 Spring 容器创建对象我们只需要向容器要对象即可。AutowiredprivateUserServiceuserService;2. IoC 的好处降低耦合度对象之间的依赖关系由容器管理代码之间不再硬编码提高可维护性修改实现类时不需要修改调用方的代码便于测试可以轻松替换为 Mock 对象进行单元测试统一管理对象的生命周期由容器统一管理3. IoC 的两种实现方式依赖查找DL通过容器提供的 API 主动查找需要的对象。ApplicationContextcontextnewClassPathXmlApplicationContext(applicationContext.xml);UserServiceuserServicecontext.getBean(userService,UserService.class);依赖注入DI容器在创建对象时自动将依赖的对象注入到当前对象中。这是 Spring 推荐的方式。DI 依赖注入1. 什么是 DIDIDependency Injection依赖注入是 IoC 的具体实现方式。当 Spring 容器创建对象时自动将对象所依赖的其他对象注入给它。2. 依赖注入的三种方式构造方法注入publicclassUserService{privateUserDaouserDao;// 通过构造方法注入publicUserService(UserDaouserDao){this.userDaouserDao;}}XML 配置beaniduserDaoclasscom.example.dao.UserDao/beaniduserServiceclasscom.example.service.UserServiceconstructor-argrefuserDao//beanSetter 方法注入publicclassUserService{privateUserDaouserDao;// 通过 Setter 方法注入publicvoidsetUserDao(UserDaouserDao){this.userDaouserDao;}}XML 配置beaniduserDaoclasscom.example.dao.UserDao/beaniduserServiceclasscom.example.service.UserServicepropertynameuserDaorefuserDao//bean注解注入最常用ServicepublicclassUserService{AutowiredprivateUserDaouserDao;}3. 常用注入注解注解说明Autowired按类型自动装配Spring 官方推荐Resource按名称自动装配JDK 提供的注解Inject和 Autowired 类似需要额外引入依赖Qualifier配合 Autowired 使用指定具体 Bean 名称Spring 容器1. 什么是 Spring 容器Spring 容器是 Spring 框架的核心负责创建、配置和管理 Bean 对象。常见的容器实现有BeanFactorySpring 最基础的容器提供基本的 IoC 功能ApplicationContextBeanFactory 的子接口功能更强大企业级开发中常用2. ApplicationContext 的常见实现类实现类说明ClassPathXmlApplicationContext从类路径加载 XML 配置文件FileSystemXmlApplicationContext从文件系统加载 XML 配置文件AnnotationConfigApplicationContext基于注解配置的容器WebApplicationContext专为 Web 应用设计的容器3. 容器的创建方式XML 配置方式!-- applicationContext.xml --?xml version1.0 encodingUTF-8?beansxmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbeaniduserDaoclasscom.example.dao.UserDao//beansApplicationContextcontextnewClassPathXmlApplicationContext(applicationContext.xml);UserDaouserDaocontext.getBean(userDao,UserDao.class);注解配置方式ConfigurationComponentScan(com.example)publicclassSpringConfig{// 配置类}ApplicationContextcontextnewAnnotationConfigApplicationContext(SpringConfig.class);混合配置方式ConfigurationImportResource(classpath:applicationContext.xml)publicclassSpringConfig{}Bean 的作用域Spring 中的 Bean 可以设置不同的作用域常见的作用域有作用域说明singleton单例模式Spring 默认作用域整个容器只有一个实例prototype原型模式每次获取都创建新的实例request每次 HTTP 请求创建一个实例仅 Web 应用session每个 HTTP Session 创建一个实例仅 Web 应用application每个 ServletContext 创建一个实例仅 Web 应用设置作用域ComponentScope(prototype)// 设置为原型模式publicclassUserService{}XML 配置方式beaniduserServiceclasscom.example.service.UserServicescopeprototype/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 学习之旅