当前位置: 首页 > news >正文

Servlet 与Spring对比!

前言:

Spring相关的框架知识,算是目前公司在用的前沿知识了,很重要!!

那么以Spring为基础的框架有几个?

以Spring为基础的框架包括若干模块,其中主要的有Spring Framework、Spring Boot、Spring Cloud等。

  1. Spring Framework:这是最基础的Spring框架,它包括了ioc依赖注入,Context上下文、bean管理等功能模块。Spring框架的主要目的就是简化Java后端开发工作,它由20个左右不同的模块组成,这些模块分别是Test、Core Container(核心容器)、Data Access/Integration(数据访问/集成)、Web、AOP/Aspect(应用对象解耦)、Instrumentation和Messaging(检测消息)。
  2. Spring Boot:这个框架的目标是简化Spring应用和服务的创建、开发与部署,比如它可以简化配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能。
  3. Spring Cloud:它是一系列框架的集合,主要用于构建分布式系统,提供配置管理、服务发现、断路器、智能路由、微代理、控制总线等功能。

    在使用这些框架时,可以根据具体的需求来选择性地使用所需要的模块,以满足企业级应用开发的需求。

相比于Spring Framework和Spring Cloud而言,小编主要着重于Spring Boot框架相关的知识来进行讲解的!当然,Spring Boot也算是很常见的框架之一了!

Servlet痛点分析:

  1. 添加外部jar不方便,容易出错(比如:添加了一个不匹配的外部jar版本)
  2. 运行和调试的时候,需要配置tomcat,不方便
  3. 发布不方便,Servlet项目必须依靠外置的tomcat(外置的Web容器运行)
  4. 路由配置不方便,一个访问地址对应一个Servlet类!
  5. …………………………

Spring基础与核心概念:

官网:spring.io

一句话概述Spring:包含了众多工具方法的Ioc容器

那么,什么是容器??

容器是用来容纳某种物品的(基本)装置(如:水杯)

那么,我们之前课程所接触到的容器有哪些??

  • List / Map《——》数据存储容器
  • tomcat《——》Web容器
  • ……………………

Ioc:全文为:Inversion of Control(汉语意思为:控制反转)实际意义为:控制(权)反转

那么,也就是说:Spring是一个“控制反转”的容器!

A对象掌握B对象的控制权(实列化),但由于B对象参数等的改变,导致A对象如何控制B对象也会发生相应的变化,为解决这一问题,将B对象给第三方,此时,A对象对B对象的控制权转移/交接给第三方,这就是控制(权)反转!!

当最底层发生变化时,整个调用链都需要修改——》耦合!(耦合:两个/两个以上的对象,相互依赖)

接下来,我们来通过传统的解法来构造一个“车”吧!!

接下来,我们来看一下相关的代码吧:

车轮胎:

public class Tire {//车轮胎public int size=17;//车身尺寸public Tire (int size){this.size=size;}public void init(){System.out.println("size -->" +size);}
}

底盘:

public class Bottom {//底盘private Tire tire;public Bottom(int size) {tire=new Tire(size);}public void init(){System.out.println("do bottom");tire.init();}
}

车身:

public class Framework {//车身private Bottom bottom;public Framework(int size){bottom=new Bottom(size);}public void init(){System.out.println("do bottom");bottom.init();}
}

车:

public class Car {//车private Framework framework;public Car(int size){framework=new Framework(size);}public void init(){System.out.println("do Car");framework.init();}public static void main(String[] args) {Car car=new Car((20));car.init();}
}

上述代码的运行结果为:

但是,对于上述的代码,当我们对其增加一个属性:color颜色的时候,其相关代码就会发生大幅度的改变!其耦合性太高!因此,我们需要对其解耦操作:Ioc高级写法:

更改后的代码为:

车轮胎:

public class Tire2 {//车轮胎public int size=17;//车身尺寸private String color="红色";public Tire2(int size, String color) {this.size = size;this.color = color;}public void init(){System.out.println("size -->" +size + "color -->"+color);}
}

底盘:

public class Bottom2 {//底盘private Tire2 tire2;public Bottom2(Tire2 tire2) {this.tire2=tire2;}public void init(){System.out.println("do bottom2~~");tire2.init();}
}

车身:

public class Framework2 {//车身private Bottom2 bottom2;public Framework2(Bottom2 bottom) {this.bottom2 = bottom;}public void init(){System.out.println("do framework2~~");bottom2.init();}
}

车:

public class Car2 {//车private Framework2 framework2;public Car2(Framework2 framework2){this.framework2=framework2;}public void init(){System.out.println("do Car2~~~");framework2.init();}}

测试类:

public class Test {//测试类public static void main(String[] args) {Tire2 tire2=new Tire2(20,"黑色");Bottom2 bottom2=new Bottom2(tire2);Framework2 framework2=new Framework2(bottom2);Car2 car2=new Car2(framework2);car2.init();}
}

那么,上述代码的运行结果为:

那么,经过上述的代码,我们可以看出:

Ioc不是一个具体的技术,它是一个思想(控制权转移)!

Ioc最比较重要的功能:解耦

既然Spring是一个Ioc(控制反转)容器,重点还在“容器”二字上,那么,它就具有两个最基础的功能:

  1. 将对象存入到容器(存对象)
  2. 从容器中取出对象(取对象)

上面两个是Spring Ioc最核心(基础)操作!!


Spring是一个Ioc容器,说的是对象的创建和销毁的权利都交给Spring来管理了,它本身具备了存储对象和获取对象的能力!

那么,我们来看一下:Spring Ioc的优点:

  1. 解耦
  2. 使用更加方便(不需要手动创建和关注这个对象背后的依赖关系)
  3. 更加高效

相关文章:

Servlet 与Spring对比!

前言: Spring相关的框架知识,算是目前公司在用的前沿知识了,很重要!! 那么以Spring为基础的框架有几个? 以Spring为基础的框架包括若干模块,其中主要的有Spring Framework、Spring Boot、Spring…...

粤嵌实训医疗项目--day03(Vue + SpringBoot)

往期回顾 粤嵌实训医疗项目day02(Vue SpringBoot)-CSDN博客 粤嵌实训医疗项目--day01(VueSpringBoot)-CSDN博客 目录 一、SpringBoot AOP的使用 二、用户模块-注册功能(文件上传) 三、用户模块-注册实现…...

spark3.3.x处理excel数据

环境: spark3.3.x scala2.12.x 引用: spark-shell --jars spark-excel_2.12-3.3.1_0.18.5.jar 或项目里配置pom.xml <!-- https://mvnrepository.com/artifact/com.crealytics/spark-excel --> <dependency><groupId>com.crealytics</groupId><art…...

哪一个更好?Spring boot还是Node.js

前言 本篇文章有些与众不同&#xff0c;由于我自己手头有些关于这个主题的个人经验&#xff0c;受其启发写出此文。虽然SpringBoot和Node.js服务于很不一样的场景&#xff0c;但是这两个框架共性惊人。其实每种语言都有不计其数的框架&#xff0c;但仅仅一部分是真正卓越的。如…...

AD7321代码SPI接口模数转换连接DAC0832输出verilog

名称&#xff1a;AD7321代码12位ADC&#xff0c;SPI接口模数转换连接DAC0832输出 软件&#xff1a;QuartusII 语言&#xff1a;VHDL 代码功能&#xff1a; 使用VHDL语言编写代码&#xff0c;实现AD7321的控制&#xff0c;将模拟信号转换为数字信号&#xff0c;再经过处理后…...

JavaScript_Pig Game切换当前玩家

const current0El document.getElementById(current--0); const current1El document.getElementById(current--1); if (dice ! 1) {currentScore dice;current0El.textContent currentScore;} else {} });这是我们上个文章写的代码&#xff0c;这个代码明显是有问题的&…...

EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明

一、准备阶段 POE交换机欧姆龙PLC 支持EtherNet Ip协议CX-Programmer 9.5配置软件 二、配置读卡器 1、打开软件 2、选择网卡&#xff0c;如果多网卡的电脑请注意对应所接的网卡&#xff0c;网卡名一般为“Network adapter Realtek PCIe GBE Family” 3、点击“选择网卡”&…...

UE5简化打包大小

UE5.3默认空项目带初学者包的打包后1G多 简化思路&#xff1a; 1.不打包初学者包&#xff08;或者创建时不包括初学者包&#xff0c;跳过第一条&#xff09; 导航&#xff1a;ProjectSettings->Project->Packaging->Packaging->Advanced->List of maps to incl…...

ThinkPHP8学习笔记

ThinkPHP8官方文档地址&#xff1a;ThinkPHP官方手册 一、composer换源 1、查看 composer 配置的命令composer config -g -l 2、禁用默认源镜像命令composer config -g secure-http false 3、修改为阿里云镜像源composer config -g repo.packagist composer https://mirror…...

NSSCTF做题第9页(2)

[SWPUCTF 2022 新生赛]ez_1zpop <?php error_reporting(0); class dxg { function fmm() { return "nonono"; } } class lt { public $impohi; public $md51weclome; public $md52to NSS; function __construct() { $this-&…...

Rust笔记【1】

元组和解构语法 let tup : (i32, f64, u8) (666, 2.0, 1);let tup (666, 2.0, 1); let (x, y, z) tup;let x tup.0; let y tup.1; let z tup.2;数组类型 数组定义是方括号&#xff1a;[ ] 元组定义是小圆括号&#xff1a;( ) 结构体定义是大括号&#xff1a;{ }&#xf…...

代码随想录训练营day3:链表part1

理论 链表的增删操作时间复杂度O(1),查询时间复杂度O(n),因为要从头结点开始。使用场景和数据完全相反 链表的储存地址是不连续的。也和数组不同。 移除链表元素 利用虚拟头结点可以同意操作。不然删除头结点需要额外写。 记得返回的是虚拟头结点的next而不是虚拟头结点retu…...

Bootstrap的咖啡网站实例代码阅读笔记

目录 01-index.html的完整代码02-图片可以通过类 rounded-circle 设置为圆形显示03-<li class"nav-item mt-1 a">中&#xff0c;类mt-1是什么意思&#xff1f;类a又是什么意思&#xff1f;04-href"javascript:void(0);"是什么意思&#xff1f;05-类f…...

2021年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 执行下列代码后&#xff0c;运行结果是&#xff1f; seq[hello,good,morning] s*.join(seq) print(s)A: hello*good*m…...

FileWriter文件字符输出流

一.概念 以内存为基准&#xff0c;把内存中的数据以字符形式写出到文件中 二.构造器 public FileWriter(Filefile) 创建字节输出流管道与源文件对象接通 public FileWriter(String filepath) 创建字节输出流管道与源文件路径接通 public Filewriter(File file,boolean append) …...

Vue的八个基础命令及作用

1.v-text 作用:获取data数据, 设置标签的内容&#xff0c;以纯文本进行显示v-text 会覆盖 标签中的内容&#xff0c;如果想要拼接数据&#xff0c;可以直接在v-text中拼接如果拼接的是数字&#xff1a;直接使用 “”如果拼接的是字符串&#xff0c;需要使用与外部不同的引号进…...

Log日志详解分析

目录 1、log日志的用途2、log日志级别3、什么时候需要输出日志1. 系统启动参数、环境变量2. 异常捕获处3. 函数获得期望之外的结果时4. 关键操作 4、日志输出的内容5、 注意事项1. 日志信息不明确2. 特殊异常处理3. 日志输出顺序4. 临时调试日志 6、xml文件配置7、linux下查看日…...

【API篇】九、Flink的水位线

文章目录 1、Flink时间语义2、事件时间和窗口3、水位线4、水位线和窗口的工作原理 1、Flink时间语义 事件时间处理时间 举个例子就是&#xff0c;一条数据在23:59:59产生&#xff0c;在00:00:01被处理&#xff0c;前者为事件时间&#xff0c;后者为处理时间。 从Flink1.12版本…...

#经典论文 异质山坡的物理模型 2 有效导水率

Binley, A., Beven, K., & Elgy, J. (1989). A physically based model of heterogeneous hillslopes: 2. Effective hydraulic conductivities. Water Resources Research, 25(6), 1227–1233. https://doi.org/10.1029/WR025i006p01227 这篇论文指出&#xff0c; 每个输…...

Java面试题-Redis-第一天(Redis简单介绍)

目录 一、Redis是什么&#xff1f;优缺点&#xff1f; 二、Redis为什么这么快&#xff1f; 三、Redis相较于Memcached有哪些优势&#xff1f; 四、为什么使用Redis做缓存&#xff1f; 五、为什么要用Redis而不用map/guava做缓存&#xff1f; 六、Redis的常用场景有哪些&am…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...