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

Spring 与 Spring Boot

48c287bf05b54ed98b05d0e1e0bcdc06.jpg什么是 Spring

 

可以理解 Spring 是一个框架。这个框架最早来源于在差不多的 20 年前的 2002 年。

 

在那个时候 Java 世界的开发还是以 EJB 为主,因为在这之前的大部分应用都会使用服务器客户端的应用模式。

 

其实这个模式在现在还是在使用的,例如 IBM 系统上的 AS400。在这个开发模式的基础上,你需要为每一台计算机部署一个客户端,然后通过客户端连上服务器。

 

在当时网络环境不是非常发达的情况下,在局域网速度还不是非常普及和很快的情况下,大部分应用都会使用这种方式来进行开发。

 

当 Java 发布以后,一切都改变了。大家发现可以使用浏览器来做很多事情,而不再需要为每一个服务器去安装客户端版本,同时因为客户端版本不兼容又会导致很多问题。

 

很多公司都慢慢的尝试使用企业级的 Java 开发,这个也就是 EJB 的原形。但是,EJB 实在太过于臃肿了,很多公司在开发的过程中实在忍受不了 EJB 的各种弊端。

 

在这个时候有一本书《 Expert One-on-One J2EE Design and Development》发布了,这本书的作者 Rod Johnson 可以说是一个大神级的任务,开创性的创建了 Spring 框架。

 

51D67wYiL8L.SX401_BO1,204,203,200

 

在 Spring 框架发布以后,很多公司都会默认使用 Spring 的库,在当时还没有 Maven 的设计思路,所以很多项目都会拷贝 Spring 框架到 Lib 目录中。

 

随着时间的推移,Spring 在 Java 开发中几乎成了所有项目都会使用的一个 lib,在这个基础上,Spring 为了简化各种 Java 的开发,在使用 Spring 的框架基础上,继续进行扩展,形成一些小的项目,这就是我们现在看到的类似:

 

Spring JDBC

Spring MVC

Spring Security

Spring AOP

Spring ORM

Spring Test

可以将上面的小项目理解为一个一个的小模块,这些小模块的作用就是扩展 Spring 框架的功能。

 

根据你项目的需要,你只需要导入需要的模块即可,Spring 会帮你做一些基础的配置工作,能够让你更加专注业务,而不是框架本身。

 

什么是 Spring Boot

Spring Boot 也可以理解为是基于 Spring 框架的一个扩展模块,或者更多一点理解为扩展项目。

 

Spring Boot 存在的目的主要也是为了简化部署过程。随着容器,微服务,等概念的兴起,Java 项目在部署上面花费的时间越来越多。

 

在解释这个概念之前,我们可以看看传统的 Java Web 项目部署过程,在完成代码编译后,进行打包,通常我们会打包成 War 或者 Ear 的包。EAR 是 Weblogic 使用的,包中的内容就是编译好的源代码,需要的依赖,然后部署到容器中运行。

 

因为 Weblogic 和 Jboss 等是基于 EJB 标准的,所以部署和启动非常臃肿。这个时候一些聪明的孩子就将一些不需要的 EJB 内容丢弃了,然后开发了其他的一些轻量容器,例如 Tomcat,Jetty 等。

 

随着项目越做越大,这样部署还是比较麻烦。因此一些人又想,那么我是否可以将 Tomcat 也打包到 Jar 文件中,让 Java 直接运行 Jar。

 

因为不同服务器上的 Tomcat 版本也会存在有兼容性问题。

 

正是基于这个思路,我们就有了 Spring Boot。

 

Spring-Boot-Features

 

你可以使用 Spring Boot 非常方便的开发一个 Web 项目。要知道在没有 Spring Boot 之前,就算要在 Web 页面上输出个 Hello World 都需要经过很多过程,有时候如果你使用了 JSP,还需要对 JSP 进行编译,非常慢也非常繁琐。

 

Spring 和 Spring Boot 使用的依赖

下面就是 Spring 使用的依赖:

 

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-web</artifactId>

    <version>5.2.9.RELEASE</version>

</dependency>

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-webmvc</artifactId>

    <version>5.2.9.RELEASE</version>

</dependency>

你可以在你的项目中,使用上面的依赖,然后打包后部署到 Tomcat 上面,你的项目也是同样可以运行的。

 

为了简化操作,你可以直接使用 Spring Boot 的依赖如下:

 

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

    <version>2.3.4.RELEASE</version>

</dependency>

然后你就可以直接打包成 JAR 来运行了,你不再需要在你的计算机上部署 Tomcat。

 

相关文章:

Spring 与 Spring Boot

什么是 Spring 可以理解 Spring 是一个框架。这个框架最早来源于在差不多的 20 年前的 2002 年。 在那个时候 Java 世界的开发还是以 EJB 为主&#xff0c;因为在这之前的大部分应用都会使用服务器客户端的应用模式。 其实这个模式在现在还是在使用的&#xff0c;例如 IBM 系统…...

Flutter 04 按钮Button和事件处理、弹框Dialog、Toast

一、按钮组件 1、按钮类型&#xff1a; 2、按钮实现效果&#xff1a; import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget build(BuildContext co…...

thinkphp6多用用模式下缩短路由隐藏index应用名

thinkphp6多用用模式下缩短路由隐藏index应用名方法&#xff1a; 找到入口文件&#xff0c;一般public目录下index.php 找到 $response $http->run(); 替换为如下代码即可 // 关键在此处 $_amain index; $_aother admin|common; // 匹配此条件&#xff0c;就按照tp默…...

AM@二阶常系数非齐次线性微分方程@待定系数法可解决的经典类型1

文章目录 abstract二阶常系数非齐次线性微分方程待定系数法可解类型类型1小结例 abstract 二阶常系数非齐次线性微分方程待定系数法可解决的经典类型1及其解法总结与应用 本文给出类型1为什么可以通过待定求出特解,并且待定函数要设成什么形式推理过程有一定工作量,而在应用中…...

大数据技术笔记

1. 大数据技术简介 大数据技术是一系列的工具和方法&#xff0c;它们可以帮助我们收集、存储和分析大量的数据&#xff0c;并将结果呈现给我们。 2. 大数据计算模式 我们需要一些方法来处理这些数据&#xff0c;就像我们需要各种各样的厨具来处理食材一样。这些方法被称为大…...

Vue 3 中的 Composition API

✨理解 Vue 3 中的 Composition API &#x1f383; Vue 3 引入了全新的 Composition API&#xff0c;相较于传统的 Options API&#xff0c;它具备许多优势和适用场景。下面将介绍 Composition API 的优势和使用场景&#xff0c;并为你带来更好的开发体验。 &#x1f381; Co…...

《TCP/IP详解 卷一:协议》第5章的IPv4数据报的总长度字段出现“不需要大于576字节的IPv4数据报“相关内容的解释

《TCP/IP详解 卷一&#xff1a;协议》第5章的IPv4数据报的总长度字段的一些解释&#xff0c;出现以下内容&#xff08;有省略&#xff09;&#xff1a; ....另外&#xff0c;主机不需要接收大于576字节的IPv4数据报.....以避免576字节的IPv4限制。 英文原文的内容&#xff08;有…...

PO-java客户端连接错误can not connect to server

问题描述&#xff1a; 换电脑或者网络环境改变了&#xff0c;PO下载EST ID的jnlp提示can not connect to server*** &#xff1b;**message server***这类错误 原因分析&#xff1a; 基本上都是PO消息服务器连接不上导致的错误&#xff0c;原理有均衡负载对应的IP转接后端口不…...

PM2 vs Kubernetes:在部署 Node.js 服务时使用哪个?

Node.js 已成为 Web 开发中的热门技术之一&#xff0c;但如果我们想成功地将 Node.js 应用程序交付给用户&#xff0c;我们需要考虑部署和管理这些应用程序。两个常见的选项是 PM2 和 Kubernetes。PM2 是一个用于运行和管理 Node.js 应用程序的进程管理器&#xff0c;它能够创建…...

配置git并把本地项目连接github

一.配置git 1.下载git&#xff08;Git&#xff09;&#xff0c;但推荐使用国内镜像下载&#xff08;CNPM Binaries Mirror&#xff09; 选好64和版本号下载&#xff0c;全部点下一步 下载完成后打开终端&#xff0c;输入 git --version 出现版本号则说明安装成功 然后继续…...

pytorch笔记 GRUCELL

1 介绍 GRU的一个单元 2 基本使用方法 torch.nn.GRUCell(input_size, hidden_size, biasTrue, deviceNone, dtypeNone) 输入&#xff1a;&#xff08;batch&#xff0c;input_size&#xff09; 输出和隐藏层&#xff1a;&#xff08;batch&#xff0c;hidden_size&#xf…...

不解压,也能列出文件信息

gz文件&#xff0c;不解压&#xff0c;查看压缩前文件的大小&#xff1a; gzip -l ~$ ll -rw-r--r-- 1 fee fee 17343450 Nov 2 12:02 xxx.log.2023-11-02T04-02-56.000.1 -rw-r--r-- 1 fee fee 3150599 Nov 2 12:02 xxx.log.2023-11-02T04-02-56.000.1.gz ~$ gzip -l gb…...

微型计算机组成原理

1、微型计算机组成 一个传统微型计算机硬件组成如下图 CPU通过地址线、数据线和控制信号线组成的本地总线&#xff08;内部总线&#xff09;与系统其他部分进行数据通信。 地址线用于提供内存或I/O设备的地址&#xff0c;即指明需要读/写数据的具体位置&#xff1b;数据线用…...

基站/手机是怎么知道信道情况的?

在无线通信系统中&#xff0c;信道的情况对信号的发送起到至关重要的作用&#xff0c;基站和手机根据信道的情况选择合适的资源配置和发送方式进行通信&#xff0c;那么基站或者手机是怎么知道信道的情况呢&#xff1f; 我们先来看生活中的一个例子&#xff0c;从A地发货到B地…...

进程/线程

进程是资源单位, 线程是执行单位。 每一个进程至少要有一个线程&#xff0c;启动每一个程序默认都会有一个主线程 1.多线程的两种实现 from threading import Thread#方法一 def func(name):for i in range(10):print(name, i)if __name__ __main__:t Thread(targetfunc, …...

Python 应用 之 转换音频格式

目录 一、python音频转换 1、pydub 音频包安装 2、 ffmpeg安装 1&#xff09;、解压后&#xff0c;添加到环境变量中 2&#xff09;、可以直接放在python安装目录下 3、python程序 1&#xff09;、引入相关包 2&#xff09;、重命名 3&#xff09;、to Mp3 4&#xf…...

Oracle JDK 和OpenJDK两者有什么异同点

Oracle JDK 和 OpenJDK 是两种不同版本的 Java Development Kit&#xff08;Java 开发工具包&#xff09;&#xff0c;它们都提供了用于开发 Java 程序的一系列工具和库。以下是它们之间的一些主要异同点&#xff1a; 相同点&#xff1a; 功能&#xff1a;在大多数情况下&…...

GPT引发智能AI时代潮流

最近GPT概念爆火&#xff0c;许多行业开始竞相发展AI &#xff0c;工作就业也将面临跳转&#xff0c;目前测试就业形势就分为了两大类&#xff0c;一类是测试行业如功能、性能、自动化综合性人才就业技能需求&#xff0c;另一类便是AI测试行业的需求普遍增长&#xff0c;原本由…...

FreeSWITCH mrcp-v2小记

最近得知有人受mrcp的困扰&#xff0c;于是写了这篇小文&#xff0c;希望能有所帮助 FreeSWITCH版本选择 目前当然选择1.10.10&#xff0c;不建议老版本&#xff0c;差别在于老版本用到的libmrcp比较旧&#xff0c;是1.2版本&#xff0c;bug比较多&#xff0c;有时会crash&am…...

如何将你的PC电脑数据迁移到Mac电脑?使用“迁移助理”从 PC 传输到 Mac的具体操作教程

有的小伙伴因为某一项工作或者其它原因由Windows电脑换成了Mac电脑&#xff0c;但是数据和文件都在原先的Windows电脑上&#xff0c;不知道怎么传输。接下来小编就为大家介绍使用“迁移助理”将你的通讯录、日历、电子邮件帐户等内容从 Windows PC 传输到 Mac 上的相应位置。 在…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...