Servlet 与Spring对比!
前言:
Spring相关的框架知识,算是目前公司在用的前沿知识了,很重要!!
那么以Spring为基础的框架有几个?
以Spring为基础的框架包括若干模块,其中主要的有Spring Framework、Spring Boot、Spring Cloud等。
- Spring Framework:这是最基础的Spring框架,它包括了ioc依赖注入,Context上下文、bean管理等功能模块。Spring框架的主要目的就是简化Java后端开发工作,它由20个左右不同的模块组成,这些模块分别是Test、Core Container(核心容器)、Data Access/Integration(数据访问/集成)、Web、AOP/Aspect(应用对象解耦)、Instrumentation和Messaging(检测消息)。
- Spring Boot:这个框架的目标是简化Spring应用和服务的创建、开发与部署,比如它可以简化配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能。
- Spring Cloud:它是一系列框架的集合,主要用于构建分布式系统,提供配置管理、服务发现、断路器、智能路由、微代理、控制总线等功能。
在使用这些框架时,可以根据具体的需求来选择性地使用所需要的模块,以满足企业级应用开发的需求。
相比于Spring Framework和Spring Cloud而言,小编主要着重于Spring Boot框架相关的知识来进行讲解的!当然,Spring Boot也算是很常见的框架之一了!
Servlet痛点分析:
- 添加外部jar不方便,容易出错(比如:添加了一个不匹配的外部jar版本)
- 运行和调试的时候,需要配置tomcat,不方便
- 发布不方便,Servlet项目必须依靠外置的tomcat(外置的Web容器运行)
- 路由配置不方便,一个访问地址对应一个Servlet类!
- …………………………
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(控制反转)容器,重点还在“容器”二字上,那么,它就具有两个最基础的功能:
- 将对象存入到容器(存对象)
- 从容器中取出对象(取对象)
上面两个是Spring Ioc最核心(基础)操作!!
Spring是一个Ioc容器,说的是对象的创建和销毁的权利都交给Spring来管理了,它本身具备了存储对象和获取对象的能力!
那么,我们来看一下:Spring Ioc的优点:
- 解耦
- 使用更加方便(不需要手动创建和关注这个对象背后的依赖关系)
- 更加高效
相关文章:

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

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

JavaScript_Pig Game切换当前玩家
const current0El document.getElementById(current--0); const current1El document.getElementById(current--1); if (dice ! 1) {currentScore dice;current0El.textContent currentScore;} else {} });这是我们上个文章写的代码,这个代码明显是有问题的&…...

EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明
一、准备阶段 POE交换机欧姆龙PLC 支持EtherNet Ip协议CX-Programmer 9.5配置软件 二、配置读卡器 1、打开软件 2、选择网卡,如果多网卡的电脑请注意对应所接的网卡,网卡名一般为“Network adapter Realtek PCIe GBE Family” 3、点击“选择网卡”&…...
UE5简化打包大小
UE5.3默认空项目带初学者包的打包后1G多 简化思路: 1.不打包初学者包(或者创建时不包括初学者包,跳过第一条) 导航:ProjectSettings->Project->Packaging->Packaging->Advanced->List of maps to incl…...

ThinkPHP8学习笔记
ThinkPHP8官方文档地址: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;数组类型 数组定义是方括号:[ ] 元组定义是小圆括号:( ) 结构体定义是大括号:{ }…...
代码随想录训练营day3:链表part1
理论 链表的增删操作时间复杂度O(1),查询时间复杂度O(n),因为要从头结点开始。使用场景和数据完全相反 链表的储存地址是不连续的。也和数组不同。 移除链表元素 利用虚拟头结点可以同意操作。不然删除头结点需要额外写。 记得返回的是虚拟头结点的next而不是虚拟头结点retu…...

Bootstrap的咖啡网站实例代码阅读笔记
目录 01-index.html的完整代码02-图片可以通过类 rounded-circle 设置为圆形显示03-<li class"nav-item mt-1 a">中,类mt-1是什么意思?类a又是什么意思?04-href"javascript:void(0);"是什么意思?05-类f…...

2021年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下列代码后,运行结果是? seq[hello,good,morning] s*.join(seq) print(s)A: hello*good*m…...

FileWriter文件字符输出流
一.概念 以内存为基准,把内存中的数据以字符形式写出到文件中 二.构造器 public FileWriter(Filefile) 创建字节输出流管道与源文件对象接通 public FileWriter(String filepath) 创建字节输出流管道与源文件路径接通 public Filewriter(File file,boolean append) …...
Vue的八个基础命令及作用
1.v-text 作用:获取data数据, 设置标签的内容,以纯文本进行显示v-text 会覆盖 标签中的内容,如果想要拼接数据,可以直接在v-text中拼接如果拼接的是数字:直接使用 “”如果拼接的是字符串,需要使用与外部不同的引号进…...
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时间语义 事件时间处理时间 举个例子就是,一条数据在23:59:59产生,在00:00:01被处理,前者为事件时间,后者为处理时间。 从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 这篇论文指出, 每个输…...
Java面试题-Redis-第一天(Redis简单介绍)
目录 一、Redis是什么?优缺点? 二、Redis为什么这么快? 三、Redis相较于Memcached有哪些优势? 四、为什么使用Redis做缓存? 五、为什么要用Redis而不用map/guava做缓存? 六、Redis的常用场景有哪些&am…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...