Spring 和 Spring Boot 之间的比较

news/2025/3/30 17:08:51/文章来源:https://www.cnblogs.com/Naylor/p/18795681

概述

本位我们将讨论标准 Spring 框架和 Spring Boot 之间的区别。

将重点讨论 Spring 的模块,如 MVC 和 Security,在 Spring 中使用时与 在Spring Boot 中使用时有何不同。

什么是 Spring

简而言之,Spring 框架为开发 Java 应用程序提供了全面的基础设施支持。它包含了一些不错的功能,如依赖注入,以及开箱即用的模块,如:

  • jdbc
  • mvc
  • security
  • aop
  • orm
  • ......

这些模块可以大大缩短应用程序的开发时间。

例如,在 Java Web 开发的早期,我们需要编写大量样板代码才能将记录插入数据源。通过使用 Spring JDBC 模块的 JDBCTemplate,我们可以将其简化为几行代码,只需少量配置即可。

什么是SpringBoot

Spring Boot 基本上是 Spring 框架的扩展,它消除了设置 Spring 应用程序所需的样板配置。它对 Spring 平台持固执己见的看法,这为更快、更高效的开发生态系统铺平了道路。以下是 Spring Boot 中的一些功能:

  • 预置的依赖项,简化构建和应用程序配置
  • 嵌入tomcat服务器
  • 指标、运行监控和外部化配置
  • 自动配置Spring功能
  • ......

Maven依赖

首先,让我们看看使用 Spring 创建 Web 应用程序所需的最低依赖项:


<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.5</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.5</version>
</dependency>

与 Spring 不同,Spring Boot 只需要一个依赖项即可启动并运行 Web 应用程序:


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.4.4</version>
</dependency>

在构建期间,所有其他依赖项都会自动添加到最终存档中。另一个很好的例子是测试库。我们通常使用 Spring Test、JUnit、Hamcrest 和 Mockito 库的集合。在 Spring 项目中,我们应该将所有这些库添加为依赖项。或者,在 Spring Boot 中,我们只需要用于测试的 starter 依赖项即可自动包含这些库。

Spring Boot 为不同的 Spring 模块提供了许多 Starter 依赖项。一些最常用的是:

  • spring-boot-starter-data-jpa
  • spring-boot-starter-security
  • spring-boot-starter-test
  • spring-boot-starter-web
  • spring-boot-starter-thymeleaf

Mvc配置

让我们探索一下使用 Spring 和 Spring Boot 创建 JSP Web 应用程序所需的配置。Spring 需要定义调度程序 servlet、映射和其他支持配置。我们可以使用 web.xml 文件或 Initializer 类来做到这一点


public class MyWebAppInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext container) {AnnotationConfigWebApplicationContext context= new AnnotationConfigWebApplicationContext();context.setConfigLocation("com.baeldung");container.addListener(new ContextLoaderListener(context));ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context));dispatcher.setLoadOnStartup(1);dispatcher.addMapping("/");}
}

我们还需要将 @EnableWebMvc 注解添加到@Configuration类中,并定义一个视图解析器来解析从控制器返回的视图


@EnableWebMvc
@Configuration
public class ClientWebConfig implements WebMvcConfigurer { @Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver bean= new InternalResourceViewResolver();bean.setViewClass(JstlView.class);bean.setPrefix("/WEB-INF/view/");bean.setSuffix(".jsp");return bean;}
}

相比之下, Spring Boot 只需要几个属性即可在我们添加 Web 启动器后正常工作:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

通过称为 auto-configuration 的过程添加 Boot Web 启动器,会自动包含上述所有 Spring 配置。这意味着 Spring Boot 将查看应用程序中存在的依赖项、属性和 bean,并基于这些启用配置。

当然,如果我们想添加自己的自定义配置,那么 Spring Boot 自动配置将退出。

配置模板引擎

现在让我们学习如何在 Spring 和 Spring Boot 中配置 Thymeleaf 模板引擎。在 Spring 中,我们需要为视图解析器添加 thymeleaf-spring5 依赖项和一些配置:


@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {@Autowiredprivate ApplicationContext applicationContext;@Beanpublic SpringResourceTemplateResolver templateResolver() {SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();templateResolver.setApplicationContext(applicationContext);templateResolver.setPrefix("/WEB-INF/views/");templateResolver.setSuffix(".html");return templateResolver;}@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver());templateEngine.setEnableSpringELCompiler(true);return templateEngine;}@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {ThymeleafViewResolver resolver = new ThymeleafViewResolver();resolver.setTemplateEngine(templateEngine());registry.viewResolver(resolver);}
}

Spring Boot 1 只需要spring-boot-starter-thymeleaf的依赖项即可在 Web 应用程序中启用 Thymeleaf 支持。由于 Thymeleaf3.0 中的新功能,我们还必须在 Spring Boot 2 Web 应用程序中添加 thymeleaf-layout-dialect 作为依赖项。或者,我们可以选择添加一个 spring-boot-starter-thymeleaf 依赖项,它将为我们处理所有这些。一旦依赖项就位,我们就可以将模板添加到 src/main/resources/templates 文件夹中,Spring Boot 将自动显示它们。

应用程序启动

Spring如何启动

Spring 既支持传统的 web.xml 引导方式,也支持最新的 Servlet 3+ 方法。

让我们逐步查看web.xml方法:

  • Servlet 容器(服务器)读取 web.xml。
  • web.xml中定义的 DispatcherServlet 由容器实例化。
  • DispatcherServlet 通过读取 WEB-INF/{servletName}-servlet.xml来创建 WebApplicationContext。
  • 最后,DispatcherServlet 注册在应用程序上下文中定义的 bean。

以下是 Spring 如何使用 Servlet 3+ 方法进行引导:

  • 容器搜索实现 ServletContainerInitializer 的类并执行。

  • SpringServletContainerInitializer查找实现WebApplicationInitializer的所有类。

  • WebApplicationInitializer 使用 XML 或 @Configuration 类创建上下文。

  • WebApplicationInitializer 使用之前创建的上下文创建 DispatcherServlet。

SpringBoot如何启动

Spring Boot 应用程序的入口点是用 @SpringBootApplication 注释的类:


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

默认情况下, Spring Boot 使用嵌入式容器来运行应用程序。在这种情况下, Spring Boot 使用 public static void main 入口点来启动嵌入式 Web 服务器。它还负责将 Servlet、Filter 和 ServletContextInitializer bean 从应用程序上下文绑定到嵌入式 servlet 容器。Spring Boot 的另一个功能是它会自动扫描 Main-class 的同一包或子包中的所有类以查找组件。此外, Spring Boot 还提供了将其作为 Web 存档部署到外部容器中的选项。在这种情况下,我们必须扩展 SpringBootServletInitializer:


@SpringBootApplication
public class Application extends SpringBootServletInitializer {// ...
}

在这里,外部 Servlet 容器查找在 Web 存档的 META-INF 文件中定义的 Main 类,而 SpringBootServletInitializer 将负责绑定 Servlet、Filter 和 ServletContextInitializer。

打包和部署

最后,让我们看看如何打包和部署应用程序。这两个框架都支持 Maven 和 Gradle 等常见的包管理技术;但是,在部署方面,这些框架差异很大。例如,Spring Boot Maven 插件在 Maven 中提供 Spring Boot 支持。它还允许打包可执行的 jar 或 war 存档,并 “就地” 运行应用程序。在部署上下文中,Spring Boot 相对于 Spring 的一些优势包括:

  • 提供嵌入式容器支持使用
  • 命令 java -jar 配置独立运行 jar
  • 选择排除依赖项以避免在外部容器中部署时发生潜在 jar 冲突
  • 部署时指定活动配置文件的选项
  • 用于集成测试的随机端口生成

结论

在本文中,我们了解了 Spring 和 Spring Boot 之间的区别。简单来说,我们可以说 Spring Boot 只是 Spring 本身的扩展,让开发、测试和部署更加方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/906615.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出现Invalid bound statement (not found)错误

出现Invalid bound statement (not found)错误时,通常是由于MyBatis无法正确匹配Mapper接口与XML文件的映射关系。以下是具体排查步骤和解决方案:

当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系

《当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系》引言:一场OOM引发的血案 某个月黑风高的夜晚,监控系统突然发出刺耳的警报——我们的数据发现流水线集体扑街。事后复盘发现:Kafka集群、Gateway、Discovery服务默契地同时表演了OOM自杀式艺术行为。这场事…

EtherCAT转DeviceNet看台达MH2如何借助网关与欧姆龙CJ1W-DRM21通讯​

一.案例背景台达MH2设备通常采用EtherCAT通信协议,这种协议在高速实时通信方面表现出色,适合设备之间的快速数据交换和精准控制。而欧姆龙CJ1W-DRM21 模块基于DeviceNet通信协议,DeviceNet在工业现场总线领域应用广泛,侧重于设备的分布式控制和信息共享。EtherCAT与DeviceN…

温湿度传感器:核心原理与跨领域应用解析

一、温湿度传感器的技术演进与核心价值 温湿度传感器是一种通过物理或化学机制实时监测环境温湿度参数的电子设备。在物联网(IoT)与智慧化转型的浪潮中,其作为环境感知的 “神经末梢”,已渗透至工业制造、农业种植、医疗仓储等领域。根据市场研究机构的数据,2025 年全球温…

20242830 2021-2022-2 《网络攻防实践》第六周作业

20242830 2021-2022-2 《网络攻防实践》第六周作业 一、知识点梳理与总结本次实验旨在学会使用Metasploit软件对Windows系统进行远程渗透实验,能够让我们深入了解漏洞的原理和利用过程,如MS08-067这样的常见漏洞,通过实际操作去发现和利用它们,可以更加直观地理解系统存在的…

数字先锋 | 打造专属AI大脑,天翼云助力重庆理工大学开启智慧校园新篇!

从在线课程的蓬勃兴起,到远程教育的逐渐普及,再到智能教学工具的广泛应用……人工智能、大数据、云计算等前沿技术迅速发展的当下,科技正以前所未有的深度和广度重塑教育领域,促使教育各个层面发生深刻变革。师生对个性化、智能化教育服务的期待与日俱增,智慧校园建设,成…

【洛谷P6464】传送门

每天刷个一两题 比较值得写的会写在这里 P6464 [传智杯 #2 决赛] 传送门 题目描述 传智专修学院里有 \(n\) 栋教学楼,有 \(m\) 条双向通行道路连接这些教学楼,不存在重边和自环。每条道路都有一定的长度,而且所有教学楼之间都可以直接或者间接的通过道路到达。我们可以很容易…

高度混淆和多层嵌套的JSP案例免杀思路

免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任。 01 分析特征 目前webshell检测方式还是以检测特征为主,像JSP木马中常见的Runtime、ProcessBuilder、rea…

某项目三台设备PCIE Surprise Down故障分析

描述: 某项目交付过程中,发现三台服务器报The PCIe Card 1 (PCIe Device) triggered an uncorrectable error的错误(如下图)分析 通过fdm/fdm_output日志,发现存在大量的PCIe的报错(如下),可以看出来全是Surprise Down Error错误,且问题都说发生在CPU1 的Riser模组上检…

关联(Association), 聚合(Aggregation), 组合(Composition) 在软件设计模式中的区别

关联(Association)、聚合(Aggregation)与组合(Composition)的区别 这三种关系都是面向对象设计中描述类之间关系的重要概念,它们在耦合强度、生命周期管理等方面有显著差异。 1. 关联(Association) 基本特征:最通用的关系类型,表示类之间的使用关系可以是单向或双向的关联对…

H7-TOOL固件2.28发布,CAN, UART和RTT三合一同时收发且实时记录,脱机烧录新增革命性一键添加新芯片功能,新增多脱机芯片支持

H7-TOOL详细介绍(含操作手册): http://www.armbbs.cn/forum.php?mod=viewthread&tid=89934H7-TOOL PLUS电池版无需升级,预装的已经是最新的2.28版。后面还有个PLUS电池板低功耗运行模式,后续也将上线。【PC软件】V2.2.8 1. 脱机烧录功能更新:- 新增MAGTRON(巨磁智能)…

gitlab+jenkins+harbor+k8s安装操作流程之java项目打包成docker镜像

介绍在Java项目打包成Docker镜像时,通常需要写Dockerfile。Dockerfile是用来构建Docker镜像的文本文件,它包括了构建Docker镜像所需的所有命令和步骤 首先Maven先构建jar包 注意:dockerfile各个参数的解释如下