SpringBoot和Spring到底有没有本质的不同?

Spring Framework和SpringBoot的区别 作为Java程序员,我们都听说过Spring,也都使用过Spring的相关产品,它使每个人可以快速、轻松地、安全地进行Java编程开发,它是迄今为止世界上最受欢迎的Java框架。本文介绍Spring、Spring Framework、SpringBoot之间的关系和区别。 阅读详情

现在的Spring相关开发都是基于SpringBoot的。

最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包。如下图:
 


使用java -jar命令就可以运行这个独立的jar包。如下图:
 


这个jar包的执行入口就是一个main函数,典型的格式如下:
 

@SpringBootApplication
public class TasteSpringApplication {
    public static void main(String[] args) {
        SpringApplication.run(TasteSpringApplication.class, args);
    }
}


从代码中可以得知,SpringApplication这个类就是SpringBoot的总入口。

以上这些内容,早已是路人皆知的事情了,这里只是再赘述一遍。


进入SpringApplication这个类的源码里,首先看到的就是几个application context所使用的类。

首先是AnnotationConfigApplicationContext,这是基于注解的非web应用使用的类,它是spring-context里面的类,现在也用于SpringBoot中。

这表明对于非web应用来说,采用传统的Spring构建,或是采用现在的SpringBoot构建,核心部分并没有什么本质区别。毕竟连类都是用的同一个。


再看就是AnnotationConfigServletWebServerApplicationContext,这是基于注解的web应用使用的类,注意,这个类是SpringBoot里的类。

其实大家都知道,在还没有SpringBoot时,基于传统Spring构建web应用时使用的是AnnotationConfigWebApplicationContext这个类。

这个类位于spring-web中,显然它是Spring里面的类。(注:本文中所说的Spring指的是SpringFramework)

这里有一个问题,不知你是否发现,从Spring到SpringBoot,非web应用使用的类没有变,web应用使用的类改变了,为啥呢?


这个问题其实很简单,从它们的启动方式的差异就能很好的说明。

传统Spring构建的web应用,会打成一个war包,放入tomcat下面。

先启动tomcat,然后tomcat再去加载它下面的web应用(即war包)。

SpringBoot构建的web应用,会打成一个jar包,采用内嵌的tomcat。

先启动jar包,会进入SpringBoot中,然后再去启动tomcat。

因为现在SpringBoot要来负责启动和停止web server,这和传统Spring完全不同,所以它要自己实现一个web application context所使用的类。

由此我们可以推断出,这个类里一定有关于web server启动和停止的相关内容。


再来观察一个细节,没错,就是类名称。

传统Spring使用的类名称可以提炼出一个关键词,就是Web。SpringBoot使用的类名称可以提炼出的关键词是ServletWebServer。

前者只有Web,说明只关注web的问题,后者除了Web外还有Server,说明除了关注web外还要关注服务器,即tomcat、jetty等这些web服务器。

由此可见,从类名称上的解释和刚刚从启动方式上的解释是吻合的,是一致的。

这也说明,“时刻关注细节,你将发现更多”。这句话不仅可以用在工作当中,亦可以用在学习中、生活中。


细心的同学又会发现,后者中还有一个Servlet呢,这又怎么解释呢?

这说明这个WebServer是基于Servlet实现的。难道还有不是基于Servlet的吗?有啊,那就是基于Reactive(响应式或反应式)的。

响应式使用的类是这个AnnotationConfigReactiveWebServerApplicationContext。可以仔细对比一下名字。

Spring从5.x引入了响应式编程。这里不做深入讨论,需要的话可以去看“编程新说”这个号之前的文章。


接着我们去源码里看看,来证实一下我们的猜想。进入ServletWebServerApplicationContext类,就是刚刚那个类的父类。

首先它定义了一个WebServer,如下图:
 


其次又创建了这个WebServer,如下图:
 


接着又启动了这个WebServer,如下图:
 


最后又关闭和释放了这个WebServer,如下图:
 


由此证明了我们的猜想,确实有关于web服务器的“全套”操作。

现在SpringBoot翻身成了主人,它不仅可以启停web服务器,还可以选择web服务器,是用tomcat、jetty还是netty,都是可以配置的。爽吧。


Spring的核心就是IOC容器,容器所作的事情就是bean定义的注册,bean的实例化、初始化、依赖的装配,bean方法的调用,bean实例的销毁。

我们先来看看bean定义的注册吧。

首先看下传统Spring的,也就是AnnotationConfigWebApplicationContext这个类的。

先定义两个成员变量,存储要注册的类和要扫描的包,如下图:
 


然后又用两个类AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner来负责注册类和扫描包,如下图:
 


最后就是具体的来执行注册类和扫描包,如下图:
 


接着再看下SpringBoot的,也就是AnnotationConfigServletWebServerApplicationContext这个类的。

也是先定义两个成员变量,和上面的如出一辙,如下图:
 


也是用相同的两个类来负责处理,如下图:
 


编程新说注:实例化时虽然调用的构造函数不同,但是最终执行的却是相同的构造函数。

最终执行具体的处理也是相同的,如下图:
 


由此可以看出传统Spring和SpringBoot在对待bean定义注册这一块,完全相同,没有任何区别。

其实这很好理解,IOC容器这块内容在Spring中已经发展的相当成熟了,是不会再有人轻易去修改它了。

因此SpringBoot和Spring在本质上没什么差别,注意这里说的是本质。

由于SpringBoot的启动方式是把自身提前把web服务器移后(即采用内嵌web服务器),所以这块是额外新增的内容。

由于SpringBoot采用根据条件(condition)自动配置的方式(AutoConfiguration),所以这块也是额外新增的内容。

这两块都是额外新增的内容,和传统Spring基本没啥关系。

因此在SpringBoot和Spring重叠的部分,其实本质没啥区别。

小梅哥Xilinx FPGA学习笔记11——亚稳态 亚稳态就是D触发器输入信号在其数据窗口期内发生变化,导致D触发器的输出进入一段时间的不稳定状态,有可能发生振荡,并最终随机稳定在高电平或者低电平。 阅读详情

相关推荐

易灵思FPGA实战:T35F324的PLL硬核配置全流程(附避坑指南)

本文详细解析了易灵思T35F324 FPGA中硬核PLL的配置全流程与核心避坑点。内容涵盖从架构理解、Interface Designer参数设置、VCO范围校验,到时钟网络冲突分析与动态重配置等实战环节,重点解决了引脚分配、资源约束和常见报错问题,为工程师提供了一套清晰可靠的配置指南。

u9v0w的博客 216

Spring 和 Spring Boot 的区别

Spring和Spring Boot是Java开发领域中最为流行的两个框架之一。它们都由Spring团队开发和维护,目的是为了简化企业级Java应用的开发过程。然而,它们在设计理念和使用方式上存在一些显著的区别。Spring框架提供了丰富的模块和组件,允许开发者根据项目需求选择合适的组件,从而实现灵活的应用设计。Spring拥有庞大而成熟的生态系统,提供了各种工具和模块,适用于不同类型的企业级应用。传统的Spring项目可以通过手动配置实现对各个组件的细粒度控制,适用于特定需求的项目。

网络技术联盟站 4156

eda、gnm、anm究竟是个啥?

eda:主成分分析 gnm:高斯网络模型 anm:各向异性网络模型

药研猿的博客 1244

Springboot 是个什么玩意?

背景知识 Spring 为 Java 程序提供了全面的基础架构支持,包含了很多非常实用的功能,如 Spring JDBC、Spring AOP、Spring ORM、Spring Test 等,这些模块的出现,大大的缩短了应用程序的开发时间,同时提高了应用开发的效率。 Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发 Spring 提供更加有力的支

weixin_38933749的博客 325

汇川AM402、H3U和上位机C#ModebusTcp通讯

目录一、测试任务二、测试环境三、PLC工程1、组态配置2、ip地址、端口号 3、全局变量定义四、C#端Winform程序创建1创建主界面 2、创建子窗口 3、运行生成,界面效果4、Modebus协议说明5、Modebus操作说明六、测试1、寄存器读测试 2、MW1300寄存器的BIT位3、写寄存器测试4、PLC断电或者断网 七、工程下载连接1、PLC作为ModebusTCP端,端口号都是502,PC端上位机软件作为TcpClient去连接多台PLC。PC端读写PLC寄存器。2、PC端在有的PLC断电、断网的

panjinliang066333的博客 2万+

STM32实战:手把手教你移植CanFestival协议栈(附完整代码)

本文提供了一份详尽的STM32平台移植CanFestival协议栈的实战指南。文章从工程搭建、定时器驱动、CAN硬件适配到对象字典配置,手把手讲解核心步骤,并附完整代码示例。重点剖析了时间管理、报文收发等关键环节的实现与常见问题解决方案,旨在帮助开发者深入理解并成功实现CANopen通信。

kiwi8的博客 274

Spring和Spring Boot区别

spring和spring boot区别二者主要区别是:1、Spring Boot提供极其快速和简化的操作,让 Spring 开发者快速上手。2、Spring Boot提供了 Spring 运行的默认配置。3、Spring Boot为通用 Spring项目提供了很多非功能性特性。

qq_37904909的博客 2万+

2017–2024年中国10米/20米分辨率水稻种植分布数据集

摘要:本数据集提供2017-2024年中国23个省级行政区的水稻种植分布数据,包含单季稻和双季稻分类(GeoTIFF格式,WGS84坐标系)。5个省份分辨率为20米,其余为10米,基于Sentinel卫星数据和TWDTW方法生成。数据公开共享(7.99GB),使用需注明来源并引用相关文献(DOI:10.12199/nesdc.ecodb.rs.2025.012)。涉及学科包括遥感、生态学和地理学,研究成果需发送至国家生态科学数据中心备案。

国科大硕士在读,分享Python/GEE/Matlab/R专业代码实践,涵盖数据分析、算法开发与应用技巧等,以代码会友。 1386

Spring 与 Spring Boot:区别、联系与选择

Spring 和 Spring Boot 都是强大的 Java 开发框架,但它们在设计理念、使用方式和应用场景上存在显著差异。Spring 提供了灵活的配置方式和强大的功能,适合大型企业级应用和复杂业务逻辑;而 Spring Boot 则通过自动配置和简化依赖管理,显著提升了开发效率,适合快速开发、微服务架构和小型项目。

Myqijiahai的博客 4249

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1644

手把手入门YOLO到改进优化教程 | 【P5进阶篇】YOLOv8损失函数改进实战-损失函数IoU之KLD Loss

在本节,将从 KLD Loss(Kullback–Leibler Divergence Loss)的理论到实战代码实现,带你把 KLD Loss融合进 YOLOv8 的训练框架中。并通过训练日志与实验结果,验证 KLD Loss 在实际工程中的优势。

嵌入式阿齐Archie 2万+

Spring & SpringBoot(详解)

容器是⽤来容纳某种物品的装置。IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是 IoC 的实现思想。Spring具备两个核心功能:将对象存⼊到容器,从容器中取出对象。对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能⼒。

qq_45559559的博客 5352

【GPFS专题5】---IBM Spectrum Scale (GPFS) 日常运维命令大全

掌握这些命令是有效管理 GPFS 集群的基础。实际生产环境中,建议结合自动化脚本和监控系统(如 IBM Storage Insights)实现高效运维。定期备份配置、监控性能指标,并进行灾备演练,是保障数据安全和系统稳定的关键。

jundao1997的专栏 841

品Spring:SpringBoot和Spring到底有没有本质的不同?

现在的Spring相关开发都是基于SpringBoot的。 最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包。如下图: 使用java -jar命令就可以运行这个独立的jar包。如下图: 这个jar包的执行入口就是一个main函数,典型的格式如下: @SpringBootApplication publicclassTasteSp...

李新杰的优快云 355

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

spring 扫描所有_SpringBoot和Spring到底有没有本质的不同?

现在的Spring相关开发都是基于SpringBoot的。最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包。如下图:使用java -jar命令就可以运行这个独立的jar包。如下图:这个jar包的执行入口就是一个main函数,典型的格式如下:@SpringBootApplication 从代码中可以得知,SpringApplication这个类就是SpringBoot的总...

weixin_39520595的博客 174

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

springboot 成员变量_SpringBoot和Spring到底有没有本质的不同?

专注于Java领域优质技术,欢迎关注文章来源:编程新说 ,作者编程新说李新杰现在的Spring相关开发都是基于SpringBoot的。最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包。如下图:使用java -jar命令就可以运行这个独立的jar包。如下图:这个jar包的执行入口就是一个main函数,典型的格式如下:@SpringBootApplicationpublic...

weixin_33186486的博客 132

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

spring jar war_品Spring:SpringBoot和Spring到底有没有本质的不同?

现在的Spring相关开发都是基于SpringBoot的。最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包。如下图:使用java -jar命令就可以运行这个独立的jar包。如下图:这个jar包的执行入口就是一个main函数,典型的格式如下:@SpringBootApplication public class TasteSpringApplication { p...

weixin_39918084的博客 79

Spring Boot 与 Spring MVC 的区别与联系:从本质到实践

本文深入解析了SpringBoot与SpringMVC的区别与联系。SpringMVC是专注于Web层的MVC框架,处理请求映射、数据绑定等Web开发核心问题;而SpringBoot是简化Spring应用开发的工具,通过自动配置、起步依赖等特性提升开发效率。两者并非替代关系,SpringBoot实际包含了SpringMVC组件。文章对比了二者在项目初始化、配置和部署方面的差异,建议新项目优先使用SpringBoot,但强调理解SpringMVC原理仍是Java开发者的重要基础。正确认识两者的定位能帮助开发者

2401_86509639的博客 2507

@component注解和@repository注解有何区别_Spring中 @Controller @Service @Repository 有什么区别?...

经常使用Spring的注解@Controller @Service @Repository @Component,却不知道他们之间有什么区别,一起来看看。一、源码@Componentpublic @interface Component { String value() default ""; }@Repository@Component public @interface Reposit...

weixin_39640849的博客 915

spring boot autoconfigure 自动配置的类,和手工 @configuration + @bean 本质区别

Spring注册Bean的两种方式本质功能相同,但存在显著差异。手工配置(@Configuration+@Bean)显式声明、完全可控,适合业务核心逻辑;自动配置(@EnableAutoConfiguration)通过条件注解按需加载,提供开箱即用的通用组件配置。关键区别在于:手工配置直接加载,自动配置依赖条件触发;前者灵活度高但需全量编写,后者减少样板代码但需理解隐式规则。实际应用中,建议业务逻辑用手工配置,基础设施用自动配置,必要时可通过exclude或覆盖Bean进行调整。

Frank 的博客 603

java 拦截器_面试官:SpringBoot拦截器和过滤器的区别是什么都不知道?

前言:前几天公司招聘Java程序员,来了个毕业快3年的小伙,公司的后台大佬去面试他,几分钟后我就看见那小伙尴尬的走出了会议室,我一猜就知道面试没过关了。后来我问大佬他是不是面试没通过?大佬没耐心的说了句:Spring拦截器和过滤器的区别都不知道。那么为了防止大家在面试中出现这种尴尬的场景,今天我们来看一下拦截器和过滤器到底有什么区别呢?一:过滤器和拦截器区别1.本质的区别:Filter过滤器是Se...

weixin_39912580的博客 408

Spring和SpringBoot比较,解惑区别

1、概述: 对于Spring和SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习SpringBoot的我当时也是一头雾水,随着经验的积累、我慢慢理解了这两个框架到底有什么区别,我相信对于用了SpringBoot很久的开发人员来说,有绝大部分还不是很理解SpringBoot到底和Spring有什么区别,看完文章中的比较,或许你有了不同的答案和看法! 2、...

weixin_43770982的博客 4万+

Spring、SpringMVC和SpringBoot的区别

一、概念 1、Spring Spring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。 2、SpringMVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校

qq_35048277的博客 3万+
上一篇: 《如果面试时大家都说真话》太真实了!!!!
下一篇: 19年常问面试题汇总:JVM+微服务+多线程+锁+高并发性能(建议收藏2020必用)
JavaAOE
博客等级 码龄7年 27粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值