引用官方网站主页的说明,Spring 官方对 SpringFramework 的描述是这样的:
spring.io/projects/sp…
The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing" of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
Spring 框架为任何类型的部署平台上的基于 Java 的现代企业应用程序提供了全面的编程和配置模型。
Spring 的一个关键元素是在应用程序级别的基础架构支持:Spring 专注于企业应用程序的 “脚手架” ,以便团队可以专注于应用程序级别的业务逻辑,而不必与特定的部署环境建立不必要的联系。
这段描述的内容只能用一个词概括:要素过多!对这里面的一些概念作一些解释,方便咱更好地理解这段话。
想必理解了这些关键概念的意思,也就更容易理解 SpringFramework 的强大了吧!
上面看到的只是官方网站的 SpringFramework 工程首页的介绍概述,进入到 5.2 版本的官方文档中,这里面也有一段解释:
docs.spring.io/spring/docs…
Spring makes it easy to create Java enterprise applications. It provides everything you need to embrace the Java language in an enterprise environment, with support for Groovy and Kotlin as alternative languages on the JVM, and with the flexibility to create many kinds of architectures depending on an application’s needs.
Spring 使创建企业级 Java 应用程序变得容易。它提供了在企业环境中使用Java语言所需的一切,并支持 Groovy 和 Kotlin 作为 JVM 上的替代语言,并且可以根据应用程序的需求灵活地创建多种体系结构。
这个描述算是更为概括和笼统吧,它同样解释了 SpringFramework 的强大和使用范围之广,另外它还提了一嘴 “运行在 JVM 上的第二语言”,这些东西咱可能很陌生,那就先不看它了。
下面小册整理一些网络上流传的比较多的 SpringFramework 概述。
观察这些概述,对比官方文档中的描述,可以额外的提取出几个关键词:
好了,有了这些概述,最终咱需要提取出一个能尽可能表述完整且精简的概述。
以下答案仅供参考,可根据个人理解和知识储备进行实际调整:
SpringFramework 是一个开源的、松耦合的、分层的、可配置的一站式企业级 Java 开发框架,它的核心是 IOC 与 AOP ,它可以更容易的构建出企业级 Java 应用,并且它可以根据应用开发的组件需要,整合对应的技术。
解释下这样概括的要点:
那既然说要学 SpringFramework ,为啥我就非得要学它啊?它凭什么值得我学呢?
通过上面对 SpringFramework 的概述,想必也能总结出一些优点和强大之处:
【以下内容可用于面试题】
可能大多数的条目看上去还是不太容易能理解的,咱先看一眼,脑海里有个印象就可以了。随着深入的学习,这些内容会慢慢的被你理解。
要知道一点:学习一门技术,不要知道是什么就立马开始,一些背景还是要稍微了解一下的,了解背景可以为后面的学习作一些信息支撑。
聊到 SpringFramework 的发展历史,这里面的故事蛮有意思的,给小伙伴们讲讲那当年的故事。小伙伴大概知道有这么回事就行,没必要记住具体的内容,咱讲这部分也就图一乐。
这个事得说回上个世纪的 1997 年,IBM 公司咱都知道,老大哥了是吧。人家那里头的大佬多啊,面对当时的 J2EE 开发,为了整一套标准的 Java 扩展开发,IBM 的大佬们费心研究,提出了一个技术思想:EJB ( Enterprise JavaBean ) ,并且还扬言说,做企业级开发就得按照我说的这么来!按照我这样做是标准的、规范的!
提出 EJB 来之后,这个思想被 Sun (那个时候 Java 还是 Sun 的)看到了,呦呵你这个东西好啊,那我是 Java 他爹啊,你这思想我能给你整合进来,壮大咱 Java 的规模和势力啊。于是在 1998 年,Java 中就有了 EJB 的标准规范,它跟当时 J2EE 的其它技术一起联合(包括 JMS 消息、JNDI 命名目录接口、JSP 服务端页面技术等等),称之为 J2EE 开发的核心技术。随后,IBM 召集的这群大佬就把 EJB 的实现给造出来了,而且在 2002 年 EJB 出了 2.0 版,那个时候基本上 EJB 已经可以横行 J2EE开发了,大家都拿 EJB 当做企业级开发的标准。
不过 EJB 虽然很牛,但学起来实在是太麻烦了,而且它本身是个重量级的技术,与应用业务的代码侵入度实在是有点高,所以搞得大家用 EJB 的时候都好痛苦。但话又说回来,人家 IBM 那么多大佬提出来、实现好的技术,你一句难学、不好用就行了?那是不是你本身太笨了才搞得你学不会呢?
也由于这个原因吧,当时的 J2EE 开发者们都是一边嘟囔着难用难学,但又不好说出来,只能含泪使用。
既然大家都用,难免会有一些铁头娃,人家就是觉得,你不好用还赖得着我脑子笨?你不好用大家还都就变成猪头了? 于是,一个伟大的神仙级人物要登场了。(bgm......)
时间到了 2002 年,有一个人叫 Rod Johnson ,他写了一本书:《Expert One-on-One J2EE design and development》 ,里面对当时现有的 J2EE 应用的架构和框架存在的臃肿、低效等问题提出了质疑,并且积极寻找和探索解决方案。大概的意思就是说,“我觉得 J2EE 开发挺好的,就是特喵的有些迷惑的设计实在是,徒增成本,方向错了”。
过了 2 年,2004 年 SpringFramework 1.0.0 横空出世,随后 Rod Johnson 又写了一本书,当时在 J2EE 开发界引起了巨大轰动,它就是著名的 《Expert one-on-one J2EE Development without EJB》,这本书中直接告诉开发者完全可以不使用 EJB 开发 J2EE 应用,而是可以换用一种更轻量级、更简单的框架来代替,那就是 SpringFramework 。
这本书一出来,开发圈都是这样的:
你一个毛头小子还敢质疑 IBM 诸多大佬的设计精华?这么狂不怕被揍吗?但是!人的四大本质之一 ———— 真香怪。后来开发界的程序猿们用了 SpringFramework 感觉确实比 EJB 好,而且 SpringFramework 提供的一些特性也比 EJB 好,于是大家就慢慢转投 SpringFramework 了。
下面咱列出一个 SpringFramework 的重要版本更新时间及重大特性,现阶段小伙伴们可以只是看一眼,后面咱讲到具体的内容时都会提及到。
SpringFramework版本 | 对应jdk版本 | 重要特性 |
---|---|---|
SpringFramework 1.x | jdk 1.3 | 基于 xml 的配置 |
SpringFramework 2.x | jdk 1.4 | 改良 xml 文件、初步支持注解式配置 |
SpringFramework 3.x | Java 5 | 注解式配置、JavaConfig 编程式配置、Environment 抽象 |
SpringFramework 4.x | Java 6 | SpringBoot 1.x、核心容器增强、条件装配、WebMvc 基于 Servlet3.0 |
SpringFramework 5.x | Java 8 | SpringBoot 2.x、响应式编程、SpringWebFlux、支持 Kotlin |
大致了解一下 SpringFramework 的核心模块,以及包含的技术,混个脸熟。
【以下内容可用于面试题】
好了,啰里八嗦了那么多,下面咱终于可以动手操作啦!冲冲冲!
下面咱用一个最最简单的实例,来体会 SpringFramework 中对于依赖查找的使用。
对于快速入门阶段来讲,咱只需要引入一个依赖即可:spring-context
(此处引入的版本是 5.2.8 )
org.springframework
spring-context
5.2.8.RELEASE
像前面咱推演出来的规矩差不多,SpringFramework 实现 IOC 可以借助配置文件的方式来描述类和对象的定义信息。在工程的 resources
目录下,咱创建一个 quickstart-byname.xml
文件(为了使配置文件的存放更具条理,且容易维护,咱提前创建好一个文件夹):
这里面的初始内容是预先规定好的,从 SpringFramework 的官方文档中可以找到 xml 配置文件的空架子:docs.spring.io/spring/docs…
将这段内容粘贴到 quickstart-byname.xml
中即可。
小伙伴们可能注意到了,粘贴了上面这段 xml 后,IDEA 会弹出一段提示:
由此可见 IDEA 是多么的智能,它意识到你要在工程中添加 SpringFramework 的配置文件,它就想让你把这个配置文件配置到 IDEA 的项目工作环境下,那咱只需要按照提示,点击 Configure application context
,随后点击 Create new application context...
,会弹出一个对话框,让你创建应用上下文:
啥也不用管,直接点 OK ,就完事了。此番动作是让 IDEA 也知道,咱在使用 SpringFramework 开发应用,IDEA 会自动识别咱写的配置,可以帮我们省很多心。
由于我的 src/main/java
中创建的包结构是按照咱小册的章节划分的,小伙伴们可以根据自己的习惯和喜好,划分包结构。下面我在咱这一小节的 com.linkedbear.spring.basic_dl.a_quickstart_byname
包下创建一个 bean 包,随后创建一个 Person
类:
创建好就可以放那儿了,也不用在里面写这写那的。
在 quickstart-byname.xml
中,使用 SpringFramework 的定义规则,将 Person
声明到配置文件中:
可以看到声明的规则很简单,跟之前咱写的 properties 形式几乎一个意思,也是 key 和 value ,只不过这里分别对应的是 id 和 class 罢了。
这么写完之后 IDEA 会报 xml 标签体为空,根据咱学过的 HTML 基础,应该知道,没有标签体的情况下是可以省略闭合标签的,咱这里就不省略了,后续还要往里面加东西。
有了配置文件,下一步可以来读这个配置文件了。在 a_quickstart_byname
包下创建一个 QuickstartByNameApplication
类,并声明 main
方法:
public class QuickstartByNameApplication {
public static void main(String[] args) {
}
}
(我个人的习惯,在写
main
方法时喜欢在方法上顺带抛Exception
,这样大部分场景下可以不用关心try-catch
操作,所以后续看到main
方法中带了throws Exception
的操作,不要方,个人编码习惯而已)
main
方法中要读这个配置文件,方法有很多种,咱快速入门中先来使用一种比较简单的方法:
public static void main(String[] args) throws Exception {
BeanFactory factory = new ClassPathXmlApplicationContext("basic_dl/quickstart-byname.xml");
Person person = (Person) factory.getBean("person");
System.out.println(person);
}
解释一下这段代码的意思。读取配置文件,需要一个载体来加载它,这里咱选用 ClassPathXmlApplicationContext
来加载。加载完成后咱直接使用 BeanFactory
接口来接收(多态思想)。下一步就可以从 BeanFactory
中获取 person
了,由于咱在配置文件中声明了 id ,故这里就可以直接把 id 传入,BeanFactory
就可以给我们返回 Person
对象。
运行 main
方法,可以成功打印出 Person
的全限定类名 + 内存地址,证明编写成功。
com.linkedbear.spring.basic_dl.a_quickstart_byname.bean.Person@6a4f787b
到这里,就可以轻松上手 SpringFramework 中 IOC 依赖查找的实现了。