目录
一、Spring 6
二、Spring框架介绍
三、Spring IoC/DI 详解
一、Spring 6
1. 为什么要学习Spring 6
Spring 作为 Java程序员必会武功,无论是Spring的哪个版本,至少需要会一版本。再此基础上不会一套 组合拳SSM或SSH,出门都不好意思说自己是Java程序员。如果真不会,别人问你是做什么工作的,你就告诉他们,你是修电脑的。
10年前使用的是SSH(Spring + Struts + Hibernate),后来变为SSI(Spring + Struts/Spring MVC + iBatis) ,再到后来的SSM(Spring + Spring MVC + MyBatis) ,我们发现任随其他技术新老更替,Spring 稳坐钓鱼台。这么多年了,Spring 在Java 领域完全是老大哥的地位,所以才能衍生出其他的顶级项目, 形成Spring家族,也就是我们平时所说的Spring 全家桶。
其中一个原因是:既然我们怎么都要学习Spring,为什么不学习最新版的Spring 6呢?就像买手机,有 iPhone 30S 一米长的屏幕,谁又还会选择买iPhone 5 呢,毕竟这一米长的手机不仅仅是手机,还是防身武器。买两个还能组成双节棍。
另一个原因:Spring 5 最低支持JDK 8,而Spring 6最低支持JDK 17,直接把JDK9~16全跳过去了(Spring 5支持JDK 8,9)。JDK 17也是Java 目前最新的一个长期支持版。可想而知在Spring 6会把JDK 17的特性 体现的淋淋尽致。 还有一个原因:同时Spring产品一直紧跟,甚至引领Java 行业潮流发展方向。通过学习最新的Spring 6 可以洞悉出Java未来的趋势。这点还是非常重要的。
2.环境准备
3.前置技术
Spring 虽然是Java程序员找工作的基础必备技能。但毕竟是一个框架,在原生Java基础上的封装。所以 里面会涉及到如下知识点
二、Spring框架介绍
1.Spring 团队及公司
我们本套课程所学的Spring框架它归属于Spring 团队。没错框架名和团队名是一样的。 首先,必须强调的一点是Spring团队并不是一个公司名,而是一个team(团队)名称,这个团队归属于 Pivotal公司。小伙伴们可能惊呆了,Java程序员必会的Spring框架只是Pivotal公司下Spring团队的一个 产品而已。可想而知,Pivotal公司是一个多么强大的公司。如果还是感受不到Pivotal公司的强大,我国 网上购票系统12306熟悉吧,12306里面就用着Pivotal公司的产品。
Pivotal公司的一些著名产品:
Pivotal公司(美国毕威拓)是主做云原生平台的。成立于2013年4月,由EMC(美国信息存储资讯科技 公司,主要业务为信息存储及管理产品、服务和解决方案。)、VMware(虚拟化的鼻祖,我们平常用 的虚拟机软件)和GE(美国通用电气公司,世界上最大的提供技术和服务业务的跨国公司)投资成立。
EMC、VMWare、Spring之间有着一大段相爱相杀的故事,中间还有第三者戴尔公司插足的情况,如果 细说起来可以拍一个《甄嬛传》了。比较重要的时间线如下:
2020年1月3日,VMware宣布完成对Pivotal的收购,至此Pivotal成为VMWare的全资子公司。交易价格 约27亿美元。按照现在的汇率计算,大约188个小目标。收购完成后Spring框架的Logo也进行了改变。 从图片可以看到Spring By Pivotal变成了Spring by VMware Tanzu。其中VMWare Tanzu是戴尔科技旗 下VMware最新推出的云原生系列产品家族名称。
2.Spring框架介绍
Spring框架英文全称Spring Framework,是由Spring团队研发的模块化、轻量级开源框架。其主要目的 是为了简化项目开发。在项目开发中,可以说没有刻意使用Spring,却处处有着Spring存在。用官网对 Spring框架的介绍:Spring框架核心功能包含依赖注入、事务管理、Web应用、数据访问、消息发送等 等。
曾经在网上流行过一个段子: 两个Java程序员对话,名字分别叫做A和B。
A:你用过Spring框架吗?
B:还用说,Java程序员谁没用过Spring框架!(带着不屑的表情)
A:那你知道Spring Framework吧?
B:Spring Framework?那不知道!
Spring Framework前身是interface21,由Rod Johnson于2002年研发,主要是为了不使用EJB下依然能 够构建高质量Java EE项目。EJB是当年横行一时的Java EE标准,但因为实现了JavaEE中所有标准,想要 用里面的功能,是买一送二,不管用不用,反正都提供,属于“重量级”标准。EJB在互联网时代几乎已经 不出现了(但是在一些工业项目中还有EJB的应用)。EJB当年在Java的地位和诺基亚手机当年在手机行 业的地位是一样的,而Spring框架就是目前手机界的苹果,国内的华为。
随着技术的更替,可能十年后,又有新的技术把Spring给替代了。我们现在把Spring学好,将来会流行 一句话:“来孩子,给你介绍一下。这位是当年Spring玩的贼6的老爷爷”
既然提到了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竞争。
2014年Spring Boot出现后又开始自己干自己了,要取代掉Spring框架。话又说回来了,虽说不学 Spring框架,直接学习Spring Boot也可以。但是学习完Spring框架可以很轻松的学会Spring Boot框 架,所以一般都拿Spring 框架作为Spring Boot框架基础学,同时在部分公司的项目依然使用Spring框 架,所以学习Spring框架的意义还是比较大的。
3.Spring Framework 主版本发布时间
到文档制作时,Spring框架最新版为6.0.6,所以本套课程就以Spring Framework 6.0.6 版本进行讲解。
4.Spring Framework 各个版本重大变化
那就不能只说Spring Framework 5 和 Spring Framework 6的区 别,这样弄的好像同学们之前学习过Spring Framework 5一样。所以有必要来说一说Spring 从1.X版本 到6.X版本的重大变化。这样才能深刻的感受到Spring Framework的发展变化。
5.Spring Framework 5和6次版本支持时间
6.Spring Framework 6 包含的模块
Spring 从3.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
三、Spring IoC/DI 详解
1.为什么要学习IoC/DI
就是因为IoC/DI 是 Spring Framework 的基础。Spring Framework 其他所有功能都是在IoC/DI 基础上 研发的。
2.脱离Spring Framework,理解下IoC/DI是什么
IoC 和 DI 并不是 Spring Framewok 提出的,这点小伙伴一定要谨记。之所以先脱离Spring Framework 来讲解IoC/DI就是为了让小伙伴们知道:
IoC/DI 不是Spring Framework特有的。Spring Framework 只是IoC/DI具体实现框架的一种
真正的理解下到底IoC/DI是什么。
IoC 英文全称 Inversion of Control ,取三个单词首字母,标准写法字母I和字母C大写,字母o小写。国 内认可度最高的翻译:“控制反转”。
在1996年,由Michael Mattson(迈克尔·马特森)在一篇讨论面向对象框架文章中最先提出 IoC 概念 的。文章中强调:可以借助第三方来解除具有依赖关系对象的耦合性。这个指导思想也就是我们在学习 IoC时一直听到的,IoC作用是解耦。
先来看看没有使用IoC和使用IoC后对比图
从图中可以看到,没有使用IoC时。想要使用对象A,但是因为对象A依赖对象B,对象B依赖对象C。这 时就必须在自己的系统中先实例化对象C,然后实例化对象B,并把对象C注入(把对象C赋值给对象B中 依赖的内容)给对象B,然后在实例化对象A,在把对象B注入给对象A。所以对象A的实例化受对象B和 对象C的影响,这样对象之间耦合度较高。而且随着系统功能的不断添加,对象A可能不仅仅依赖对象 B,对象C,而是依赖几个,十几个,甚至几十个对象。在这样复杂的系统中,这几十个对象可能因为其 中一个出问题,而导致对象A的不可用。这些对象就属于耦合度过高。
使用IoC后,所有对象的控制权(实例化)都交给了第三方的IoC 容器(IoC Container),对象之间注 入都交给容器去完成。这样从对象实例化到在容器内部对象之间注入的整个过程就是所谓的IoC。所以千 万不要觉得IoC就是:“由程序员实例化的事情交给容器”,这样理解太片面了。
随着IoC的发展,IoC不再是为了实例化某个对象,而把某个对象放入到容器中。而是结合面向对象中多 态(也是我们所说的面向接口编程),当我们想要某个类型的对象时,告诉IoC容器,要的是某个类型的 基类(父类)或接口,然后通过特定的规则,让容器挑选出我们想要的对象。这样我们更不需要关注类 型对象的细节,完全有第三方容器进行控制,实现真正意义上的解耦。这也是为什么我们在使用IoC时都 是获取接口类型对象或基类类型对象。
2004年,Martin Fowler(马丁·福勒)对IoC做出了再次探讨。想要实现IoC,其中一个步骤,包含由IoC 容器动态的把当前对象所依赖的对象注入进来。也就是说实现IoC的过程必定包含注入。为了让IoC更加 好理解,给IoC起了另外一个名字DI(Dependency Injection,依赖注入)。
所以:IoC和DI是同一件事情。只是从不同角度,起了两个不同的名称。小伙伴们在理解IoC和DI时千万不 要认为他俩是两个事情。这就好比我正常的名字叫做张佳明,但是写代码时我用的名字是smallming, 是一样的道理的,只是称呼不同,但都是我。