不论是哪个框架,不会平白无故诞生,不会平白无故地被人所追捧,了解其背景,追根溯源。
让我们把时间拨回到2002年,当时JAVAEE和EJB正大行其道。Spring的作者觉得其太重了,并不是所有人都需要EJB的功能,因此搞出了一套框架interface21,即Spring的前身。
思考1:Spring和EJB到底孰轻孰重?
回顾历史,我们来看现在的Spring,实际上其生态已经非常完善,也已经变得非常重,但是我们可以选择性地使用其特性,而且使用过程中我们对其感知稍弱。
那么EJB呢,为什么Rod Johnson会觉得EJB重呢?我们需要完全地投入到EJB中去,EJB的一些设计理念过于复杂,侵入性强,开发者需要严重依赖(Spring现在难道不是吗)。
思考2:到底什么是轻量级
这里有一个公式:轻量系数=解决的问题/侵入程度。简单来说就是解决问题的时候,侵入程度越低,就越轻量。
注:EJB当时是Java霸主,官方的标准,可以说Spring诞生于EJB统治的黑暗年代。
技术没有银弹,只有实事求是,解决问题。
当时的开发严重依赖EJB,但是对于大多数程序员来说,很难理解和掌握,严重影响开发效率。Spring就在这时候带着其愿景:高效、简洁、轻量走入了人的视野。
解决的什么痛点:Java应用开发严重依赖J2EE的标准规范框架EJB,EJB非常的臃肿,抽象复杂,很难被大众掌握,影响开发效率。
没有完美的技术、完美的框架、完美的实现。
优点:起初Spring非常轻量,仅包括IOC和DI、以及AOP,控制反转和依赖注入、AOP切面编程让你用的爱不释手。
缺点:框架的生态总要发展的,生态越来越多,配置越来越臃肿,它已经不再让我们感觉到轻量,因为配置太多了。
缺点就是问题,问题就要解决。那么怎么解决的呢,后面我们会分析Spring Boot,到时候就知道了。
这个技术有哪些核心的功能,亮点是什么?能给我们带来什么价值、收益?
Spring最初的核心:IOC和AOP,让我们可以更轻量的编码(还记得前面提的什么是轻量吗)。
通过IOC和DI我们不再需要大量的new对象set对象进行注入,一切交给Spring,我们只需要简单的在代码之外的配置(spring.xml)里配置一下bean就行了。一切是多么的美好,因为它轻量。
通过AOP我们实现切面编程,我们可以抽取切面,对公共的能力进行提取,日志、权限、监控,一切更加美好了。
Spring 后来引入了事务管理、MVC,我们的开发更加简单了。我们摒弃了原来用的Struts、丢掉了原生的JDBC,开发效率大大提高。
芒格曾经说过,我们要学习重要学科的重要原理,像我们学习技术一样,我们要学习主要框架的核心实现原理,了解其本质,了解其解决的痛点,追其本质。
IOC全称:Inversion of Control,即控制反转,是一种设计思想。简单来说就是把创建对象的任务交给框架,而不是我们自己编码。
首先我们肯定想到容器嘛,肯定是一种数据结构、比如集合。那么Spring中到底是用什么实现的呢?
如果看过源码的小伙伴,肯定知道,其底层是一个Map,当然还是ConcurrentHashMap。
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
有时候我们会说DI是IOC的实现方式。
IOC主要的实现方式有两种:依赖查找,依赖注入。
AOP本质是拦截,拦截的本质是代理。
记得在Spring MVC组件没出来之前,我们会用什么框架?SSI、SSH(Spring Struts Hibernate)、SSM(当然现在也是SSM)。那么Spring MVC诞生的背景是什么?Struts真的就那么差吗?这里有必要说一下Java web框架的发展史:JSP/Servlet、Struts1.x、Struts2.x、Spring MVC。
Model 1模型
model 2模型,步入MVC时代
MVC框架诞生
Struts1.x
Struts2.x
思考:为什么Struts2会被淘汰?
答案是:1. 漏洞太多,修不过来;2.Spring 太火了能用Spring 搞定的事情你会用其他框架吗,这种很少,我们可以看到招聘要求,很多时候都会要求Spring Mybatis这些框架能力,而很少提起Struts2了
Spring MVC
在JSP、Servlet编码泛滥的那个年代,我们会写很多的Servlet,Filter,需要调整各种顺序,在web.xml里配置各种配置。我们都知道编写Java Web都离不开其核心Servlet,那么Spring MVC是如何搞的,它能脱离规范吗?答案是:不能。
Spring MVC离不开Servlet,其本质就是Servlet,然后在Servlet执行的流程上添加了很多特性。
其核心就是DispatcherServlet
Spring MVC工作流程,可以发现其核心就是DispatcherServlet,其他的都是流程中的扩展,让整个处理流程可以更容易扩展,解耦性更强。
分析发展路线图、分析核心版本,追根溯源。
可以看到其版图已经从原来的IOC容器和AOP后来扩张到了Web领域、Dao领域、ORM领域以及一些常用的JEE组件领域。
最后,当然Spring已经延伸出了Spring Boot、Spring Cloud以及现阶段的Spring Cloud Data Flow,接下来我们也会一点点剖析其本质。