框架的本质分析——Spring框架 spring框架的主要作用
yuyutoo 2024-10-27 16:58 6 浏览 0 评论
诞生的背景
什么背景下诞生了该技术?
不论是哪个框架,不会平白无故诞生,不会平白无故地被人所追捧,了解其背景,追根溯源。
让我们把时间拨回到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本质是什么?
IOC全称:Inversion of Control,即控制反转,是一种设计思想。简单来说就是把创建对象的任务交给框架,而不是我们自己编码。
我们一直在说IOC容器,那么容器的本质是什么?
首先我们肯定想到容器嘛,肯定是一种数据结构、比如集合。那么Spring中到底是用什么实现的呢?
如果看过源码的小伙伴,肯定知道,其底层是一个Map,当然还是ConcurrentHashMap。
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
DI依赖注入本质是什么?
有时候我们会说DI是IOC的实现方式。
IOC主要的实现方式有两种:依赖查找,依赖注入。
AOP的底层原理是什么?
AOP本质是拦截,拦截的本质是代理。
Spring MVC为何诞生?
记得在Spring MVC组件没出来之前,我们会用什么框架?SSI、SSH(Spring Struts Hibernate)、SSM(当然现在也是SSM)。那么Spring MVC诞生的背景是什么?Struts真的就那么差吗?这里有必要说一下Java web框架的发展史:JSP/Servlet、Struts1.x、Struts2.x、Spring MVC。
Java Web的发展史
Model 1模型
model 2模型,步入MVC时代
MVC框架诞生
Struts1.x
Struts2.x
思考:为什么Struts2会被淘汰?
答案是:1. 漏洞太多,修不过来;2.Spring 太火了能用Spring 搞定的事情你会用其他框架吗,这种很少,我们可以看到招聘要求,很多时候都会要求Spring Mybatis这些框架能力,而很少提起Struts2了
Spring MVC
Spring MVC实现原理是什么?本质是什么?
在JSP、Servlet编码泛滥的那个年代,我们会写很多的Servlet,Filter,需要调整各种顺序,在web.xml里配置各种配置。我们都知道编写Java Web都离不开其核心Servlet,那么Spring MVC是如何搞的,它能脱离规范吗?答案是:不能。
Spring MVC离不开Servlet,其本质就是Servlet,然后在Servlet执行的流程上添加了很多特性。
其核心就是DispatcherServlet
Spring MVC工作流程,可以发现其核心就是DispatcherServlet,其他的都是流程中的扩展,让整个处理流程可以更容易扩展,解耦性更强。
为何如此发展
分析发展路线图、分析核心版本,追根溯源。
Spring发展史
Spring的核心版图
可以看到其版图已经从原来的IOC容器和AOP后来扩张到了Web领域、Dao领域、ORM领域以及一些常用的JEE组件领域。
最后,当然Spring已经延伸出了Spring Boot、Spring Cloud以及现阶段的Spring Cloud Data Flow,接下来我们也会一点点剖析其本质。
相关推荐
- 全局和隐式 using 指令详解(全局命令)
-
1.什么是全局和隐式using?在.NET6及更高版本中,Microsoft引入了...
- 请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍
-
1、介绍模块化单体是一种架构风格,代码是根据模块的概念构成的。对于许多组织而言,模块化单体可能是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。Spri...
- ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战
-
我是一位多年后端经验的工程师,其中前几年用ASP.NET...
- .NET AOT 详解(.net 6 aot)
-
简介AOT(Ahead-Of-TimeCompilation)是一种将代码直接编译为机器码的技术,与传统的...
- 一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)
-
哈喽,我是老鱼,一名致力于在技术道路上的终身学习者、实践者、分享者!...
- asar归档解包(游戏arc文件解包)
-
要学习Electron逆向,首先要有一个Electron开发的程序的发布的包,这里就以其官方的electron-quick-start作为例子来进行一下逆向的过程。...
- 在PyCharm 中免费集成Amazon CodeWhisperer
-
CodeWhisperer是Amazon发布的一款免费的AI编程辅助小工具,可在你的集成开发环境(IDE)中生成实时单行或全函数代码建议,帮助你快速构建软件。简单来说,AmazonCodeWhi...
- 2014年最优秀JavaScript编辑器大盘点
-
1.WebstormWebStorm是一种轻量级的、功能强大的IDE,为Node.js复杂的客户端开发和服务器端开发提供完美的解决方案。WebStorm的智能代码编辑器支持JavaScript,...
- 基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享
-
项目简介:基于JS的超轻量级聊天软件。前端:vue、iview、electron实现的PC桌面版聊天程序,主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket。支持...
- JetBrains Toolbox推出全新产品订阅授权模式
-
捷克知名软件开发公司JetBrains最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境IntelliJIDEA,相信很多开发者都有所了解。而近期自2015年11月2日起,JetBr...
- idea最新激活jetbrains-agent.jar包,亲测有效
-
这里分享一个2019.3.3版本的jetbrains-agent.jar,亲测有效,在网上找了很多都不能使用,终于找到一个可以使用的了,这里分享一下具体激活步骤,此方法适用于Jebrains家所有产品...
- CountDownTimer的理解(countdowntomars)
-
CountDownTimer是android开发常用的计时类,按照注释中的说明使用方法如下:kotlin:object:CountDownTimer(30000,1000){...
- 反射为什么性能会很慢?(反射时为什么会越来越长)
-
1.背景前段时间维护一个5、6年前的项目,项目总是在某些功能使用上不尽人意,性能上总是差一些,仔细过了一下代码发现使用了不少封装好的工具类,工具类里面用了好多的反射,反射会影响到执行效率吗?盲猜了一...
- btrace 开源!基于 Systrace 高性能 Trace 工具
-
介绍btrace(又名RheaTrace)是抖音基础技术团队自研的一款高性能AndroidTrace工具,它基于Systrace实现,并针对Systrace不足之处加以改进,核心改进...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- .NET 奇葩问题调试经历之3——使用了grpc通讯类库后,内存一直增长......
- 全局和隐式 using 指令详解(全局命令)
- 请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍
- ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战
- .NET AOT 详解(.net 6 aot)
- 一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)
- asar归档解包(游戏arc文件解包)
- 在PyCharm 中免费集成Amazon CodeWhisperer
- 2014年最优秀JavaScript编辑器大盘点
- 基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)