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

【Spring Boot 】详解

Spring Boot 详解

一、Spring Boot 概述

(一)产生背景

随着 Java 应用的日益复杂,传统 Spring 框架在项目搭建与配置方面愈发繁琐,大量的 XML 配置、依赖管理等工作耗费开发者诸多精力。为解决这些痛点,Spring Boot 应运而生,旨在简化 Spring应用的初始搭建以及开发过程,让开发者能更聚焦于业务逻辑实现。

(二)特点与核心优势

1. 自动配置

Spring Boot 的自动配置是其一大亮点。

其核心原理基于条件注解(如 @Conditional 及其衍生注解)以及大量的配置类。以下是部分关键源码展示:

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourceAutoConfiguration.DataSourceInitializerConfiguration.class,DataSourceAutoConfiguration.DataSourceJmxConfiguration.class })
public class DataSourceAutoConfiguration {// 内部有诸多方法和逻辑用于根据条件判断是否要创建数据源相关的配置以及如何配置@Configuration@Conditional(EmbeddedDatabaseCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })protected static class EmbeddedDatabaseConfiguration {// 比如这里根据是否存在嵌入式数据库相关类等条件,来决定是否创建嵌入式数据库的配置@Bean@ConfigurationProperties(prefix = "spring.datasource.embedded")public EmbeddedDatabaseFactoryBean embeddedDatabaseFactory(EmbeddedDatabaseType databaseType) {EmbeddedDatabaseFactoryBean factory = new EmbeddedDatabaseFactoryBean();factory.setDatabaseType(databaseType);return factory;}}
}
  • 从源码角度看,像 DataSourceAutoConfiguration 这样的自动配置类,会根据类路径下是否存在特定的类(通过 @ConditionalOnClass 判断)等诸多条件,来决定是否要进行数据源相关配置的创建以及初始化。Spring Boot 启动时会扫描所有的自动配置类,满足条件的配置就会生效,从而减少了开发者手动配置数据源等繁琐操作。
  • 在性能方面,自动配置在启动阶段虽需遍历大量的配置类并判断条件,但得益于条件缓存等机制,后续重复启动的性能损耗不大。应用场景上,适用于各种规模的 Spring 项目,尤其新项目快速搭建基础环境时,无需开发者深入了解每个组件的详细配置细节。
2. 起步依赖

Spring Boot 的起步依赖通过 spring-boot-starter 系列的依赖管理机制实现。

它将相关功能模块所需的依赖进行了整合打包,例如 spring-boot-starter-web 会包含 Spring Web 开发所需的 Spring、Servlet、Tomcat 等相关依赖。

在 spring-boot-dependencies 这个父项目的 pom.xml 文件中有核心的依赖管理配置,如下(简化示意):

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- 众多其他起步依赖配置 --></dependencies>
</dependencyManagement>

这样开发者只需引入对应的起步依赖,就能确保项目具备相应功能模块的完整依赖,避免了版本冲突等问题。性能上,减少了开发者查找和管理众多单个依赖版本的时间成本。应用场景广泛,无论是小型的 API 服务开发还是大型企业级应用构建,都能快速引入所需功能依赖。

(三)项目搭建流程

以使用 IDEA 为例,新建项目时选择 Spring Initializr 模板,填写项目基本信息(如项目名、包名等),然后在依赖选择界面勾选所需的起步依赖(如 Web 开发相关依赖),点击完成即可创建一个简单的 Spring Boot 项目,项目结构中会自动生成启动类等基础代码,方便后续开发。

二、Spring Boot 配置文件

(一)格式与作用

  • application.properties:是传统的键值对格式配置文件
    例如:properties:
server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/test

配置文件用于定制项目的各类参数,涵盖服务器端口、数据库连接、日志级别等多方面,是调整项目运行行为的关键所在。

(二)常用配置项

服务器相关配置:
  • server.port:用于指定项目启动后监听的端口号,源码中在 ServerProperties 类里有对应的属性及 setter 方法(部分简化源码):
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {private int port = 8080;public void setPort(int port) {this.port = port;}// 还有诸多其他服务器相关属性及配置逻辑
}

当修改配置文件中的 server.port 值时,Spring Boot 在启动过程中会通过属性绑定机制将该值设置到 ServerProperties 类对应的 port 属性上,进而影响服务器启动监听的端口。性能方面,端口配置加载简单快速,几乎不产生额外性能开销。应用场景为不同环境(开发、测试、生产)下需要切换端口时使用。

  • 数据库连接配置:像 spring.datasource.url、spring.datasource.username、spring.datasource.password 等配置项用于连接数据库。在 DataSourceAutoConfiguration 等相关配置类中,会读取这些配置值来构建数据源对象,其性能影响取决于数据库驱动等底层实现,应用场景自然是所有需要与数据库交互的项目都需配置。

三、Spring Boot 中集成 Web 框架及内置服务器相关

(一)集成 Spring Web

Spring Boot 集成 Spring Web 时,引入 spring-boot-starter-web 起步依赖后,内部通过自动配置机制完成了诸多设置。在 WebMvcAutoConfiguration 这个关键的自动配置类中(部分源码展示):

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class })
public class WebMvcAutoConfiguration {// 配置了默认的 DispatcherServlet,它是 Spring Web 中处理请求分发等核心逻辑的组件@Beanpublic DispatcherServlet dispatcherServlet() {return new DispatcherServlet();}// 还有配置视图解析器、静态资源处理等诸多与 Web 开发紧密相关的逻辑和组件配置@Configuration@Import(EnableWebMvcConfiguration.class)public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {// 比如添加拦截器的配置逻辑等@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 具体的添加逻辑示例,可自定义拦截器添加在此处}}
}

从源码可知,它会根据条件判断项目是否是基于 Servlet 的 Web 应用等情况,自动创建 DispatcherServlet 等核心组件,并配置相关的拦截器、视图解析器等,方便开发者快速开展 Web 开发。性能上,由于自动配置了常用的高效处理逻辑,在处理常规 Web 请求时性能表现良好,适合各类 Web 应用开发场景,从小型的网站后端到大型的企业级 Web 服务都适用。

(二)集成 Spring WebFlux

对于 Spring WebFlux,在引入 spring-boot-starter-webflux 起步依赖后,同样有对应的自动配置类发挥作用,基于响应式编程模型构建非阻塞式的 Web 应用。例如 WebFluxAutoConfiguration 类(部分源码示意):

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
@ConditionalOnClass({ WebFluxConfigurer.class, ReactiveWebServerFactory.class })
@ConditionalOnMissingBean(WebFluxConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ ReactiveWebServerFactoryAutoConfiguration.class })
public class WebFluxAutoConfiguration {// 配置响应式的 Web 服务器工厂等核心组件,用于创建响应式的服务器实例@Beanpublic ReactiveWebServerFactory reactiveWebServerFactory() {// 根据具体条件,比如配置选择创建不同类型(如 Netty、Tomcat 等支持的响应式模式)的服务器工厂return new DefaultReactiveWebServerFactory();}// 配置路由等响应式 Web 相关逻辑,使得请求能正确路由到对应的处理器方法@Configuration@Import(EnableWebFluxConfiguration.class)public static class WebFluxAutoConfigurationAdapter extends WebFluxConfigurerAdapter {@Overridepublic void configureRoutes(RouterFunctionRegistration registration) {// 自定义路由配置逻辑示例,可将请求映射到具体的响应式处理器函数上}}
}

其性能优势在于应对高并发场景时,基于非阻塞的 I/O 模型,能更高效地利用系统资源,减少线程阻塞等待时间。应用场景多集中在需要处理大量并发请求且对响应及时性要求高的场景,比如实时数据推送、大规模 API 网关等项目。

(三)内置服务器的切换及配置方法

Spring Boot 内置了 Tomcat、Jetty、Undertow 等服务器。以切换服务器为例,在 pom.xml 文件中排除默认的服务器依赖(如排除 Tomcat 依赖),再引入想要使用的服务器依赖即可实现切换。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration</artifactId></exclusion><exclusion><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>9.4.46.v20220331</version>
</dependency>

在源码层面,ServletWebServerFactoryAutoConfiguration 等配置类会根据项目依赖情况创建对应的服务器实例(如 TomcatServletWebServerFactory 创建 Tomcat 服务器实例),切换依赖就改变了实例化的服务器类型。不同服务器在性能上各有优劣,Tomcat 通用性强、应用广泛;Jetty 启动快,在轻量级应用中有优势;Undertow 在高并发下性能出色。应用场景可根据项目对性能、资源占用等方面的需求来选择切换使用。

Spring Boot 通过其强大的自动配置、方便的配置文件以及灵活的 Web 框架集成与内置服务器管理等功能,极大地简化了 Spring
应用开发过程,在众多 Java 项目开发场景中都有着广泛且重要的应用。

相关文章:

【Spring Boot 】详解

Spring Boot 详解 一、Spring Boot 概述 &#xff08;一&#xff09;产生背景 随着 Java 应用的日益复杂&#xff0c;传统 Spring 框架在项目搭建与配置方面愈发繁琐&#xff0c;大量的 XML 配置、依赖管理等工作耗费开发者诸多精力。为解决这些痛点&#xff0c;Spring Boot …...

Redisson 框架详解

目录 一.为什么要使用分布式锁&#xff1f; 二.Redisson 的基本使用&#xff1a; 1.添加 Redisson 依赖&#xff1a; 2.在 application.yml 配置 Redis&#xff1a; 3. 创建 Redisson 客户端&#xff1a; &#xff08;1&#xff09;单节点模式&#xff1a; &#xff08;…...

正确导入MapStruct并避免与Lombok编译冲突的深入分析

正确导入MapStruct并避免与Lombok编译冲突的深入分析 一、MapStruct与Lombok概述 1.1 MapStruct简介 MapStruct是一个代码生成器,它基于约定优于配置的原则,通过注解处理器在编译时自动生成源代码,实现对象之间的属性映射。MapStruct的优势在于减少样板代码,提高开发效率…...

K8S 黑魔法之如何从 Pod 拿到节点的命令行

搞 K8S 运维的时候&#xff0c;偶尔会遇到一个难题&#xff0c;定位到问题出在某个节点上&#xff0c;而由于权限审批&#xff0c;错误配置等等各种原因&#xff0c;没有办法拿到节点的 SSH 权限&#xff0c;无法进入节点命令行进一步排障。 这个时候&#xff0c;就可以用这个…...

【bluedroid】A2dp Source播放流程源码分析(4)

接上集分析:【bluedroid】A2dp Source播放流程源码分析(3)-CSDN博客 蓝牙和AUDIO之间的接口 蓝牙和audio之间的通信是通过socket,管理socket中的文件是UIPC,UIPC管理两条socket。 A2DP_CTRL_PATH /data/misc/bluedroid/.a2dp_ctrl A2DP_DATA_PATH /data/misc/bluedroid…...

计算机网络 (9)数据链路层

前言 计算机网络中的数据链路层&#xff08;Data Link Layer&#xff09;是OSI&#xff08;开放系统互连&#xff09;参考模型中的第二层&#xff0c;位于物理层和网络层之间。它在物理层提供的服务基础上&#xff0c;负责在相邻节点之间建立、维护和终止链路&#xff0c;确保数…...

kubernetes学习-集群搭建部署(一)

一、开三台虚拟机进行试验&#xff08;centos7) 1、初始操作 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 关闭selinux sudo sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时# 关闭swap sudo swapoff -a # 临时 s…...

docker commit生成的镜像瘦身

1、清除宿主系统的docker资源 docker system prune -a --volumes 2、清理容器内系统的临时文件和缓存 # 删除包管理器缓存 apt-get clean rm -rf /var/lib/apt/lists/* # 删除日志文件 rm -rf /var/log/* # 删除临时文件 rm -rf /tmp/* 3、安装docker squash工具&#xff0…...

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…...

7.若依参数设置、通知公告、日志管理

参数设置 对系统中的参数进行动态维护。 关闭验证码校验功能 打开页面注册功能 需要修改前端页面代码 通知公告 促进组织内部信息传递 若依只提供了一个半成品&#xff0c;只实现了管理员可以添加通知公告。 日志管理 追踪用户行为和系统运行状况。 登录日志 和操作日志…...

基于FISCO BCOS的电子签署系统

概述 本项目致力于构建一个安全、高效且功能完备的电子签署系统&#xff0c;通过整合区块链技术与传统数据库管理&#xff0c;为用户提供了可靠的电子签署解决方案&#xff0c;有效应对传统电子签署系统的数据安全隐患&#xff0c;满足企业和个人在数字化办公环境下对电子文档…...

RocketMQ(二)RocketMQ实战

文章目录 一、RocketMQ实战1.1 批量消息发送1.2 消息发送队列自选择1.3 事务消息1.4 SpringCloud集成RocketMQ 二、最佳实践2.1 生产者2.1.1 发送消息注意事项2.1.2 消息发送失败处理方式 2.2 消费者2.2.1 消费过程幂等2.2.2 消费打印日志 2.3 Broker 三、相关问题3.1 为什么要…...

Java重要面试名词整理(十三):RocketMQ

文章目录 简述环境搭建分布式集群配置升级高可用集群 RocketMQ的消息模型基本流程消息确认机制广播消息顺序消息机制延迟消息批量消息过滤消息事务消息ACL权限控制机制 调优消费者端进行幂等控制 核心客户端负载均衡Consumer负载均衡 消息持久化设计Dleger集群的文件同步机制 简…...

机器学习之线性回归算法预测数据

机器学习之线性回归算法预测数据 目录 机器学习之线性回归算法预测数据线性回归算法概念理解算法导入线性回归模型参数理解误差项分析 LinearRegression理解参数理解返回值方法基本格式 预测一元线性回归数据问题及理解可视化数据理解数据预测 预测二元线性回归数据问题及理解数…...

Python | 如何在Matplotlib中仅绘制热图的上/下三角形

热图是一种强大的可视化工具&#xff0c;用于以矩阵格式表示数据&#xff0c;其中各个值由颜色表示。它们对于可视化相关矩阵特别有用&#xff0c;其中矩阵的对称性质使得显示上下三角形变得多余。本文将指导您使用Matplotlib&#xff08;Python中流行的绘图库&#xff09;仅绘…...

Leetcode经典题20--长度最小的子数组

题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 输入输出示例 输入&…...

【计算机视觉】超简单!维纳滤波的经典案例

Hey小伙伴们&#xff01;今天来给大家分享一个 计算机视觉 中非常经典且实用的技术——维纳滤波&#xff08;Wiener Filter&#xff09;。维纳滤波是一种基于最小均方误差准则的滤波方法&#xff0c;广泛应用于图像去噪、模糊恢复等领域。它不仅可以有效去除图像中的噪声&#…...

【closerAI ComfyUI】快速洗图!高效快速的提示词反推节点——cliption,让洗图出图快人一步不爆显存!

添加图片注释,不超过 140 字(可选) 【closerAI ComfyUI】快速洗图!高效快速的提示词反推节点——cliption,让洗图出图快人一步不爆显存! 大家好,我是Jimmy。反推提示词的节点有很多,像Florence2 、Joycaption2、喵手等。都是非常优秀的。但是呢,就是占用设备资源,加…...

AE Dressler CESAR 1312 Generator Model User Manual

AE Dressler CESAR 1312 Generator Model User Manual...

【513. 找树左下角的值 中等】

题目&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 提示: 二叉树的节点个数的范围是 …...

网络通信的瑞士军刀:Python socket库全解析

文章目录 网络通信的瑞士军刀&#xff1a;Python socket库全解析背景库介绍安装与重要性简单库函数使用方法场景应用常见Bug及解决方案总结 网络通信的瑞士军刀&#xff1a;Python socket库全解析 背景 在现代编程中&#xff0c;网络通信是不可或缺的一部分。无论是构建客户端…...

【笔记️】魔爪 Mini mx 使用快捷键

B站教程地址&#xff1a;MOZA魔爪的个人空间-MOZA魔爪个人主页-哔哩哔哩视频 1、开关键: 单击 → 开启录制/拍照 → 再次单击结束&#xff1b;休眠时,单击晚醒 双击 → 切换拍照/录制模式 三击 → 切换横竖拍 长按 → 关机 2、变焦键: 单击 → 切换航向俯仰跟随模式 ( 开机默…...

去除 el-input 输入框的边框(element-ui@2.15.13)

dgqdgqdeMac-mini spid-admin % yarn list --pattern element-ui yarn list v1.22.22 └─ element-ui2.15.13 ✨ Done in 0.23s.dgqdgqdeMac-mini spid-admin % yarn list vue yarn list v1.22.22 warning Filtering by arguments is deprecated. Please use the pattern opt…...

Vue中的一些用法

一、验证规则&#xff1a; 身份证的验证规则&#xff1a; 电话号码的验证规则&#xff1a; 二、选中一项后禁用其他选项&#xff1a; data(){ return{ dataForm{ medicalHistory:[] } }, 三、多选框选择后页面中不显示数据&#xff1a; 在表单提交时加 .join(",&…...

异步爬虫之协程的基本原理

我们知道爬虫是 IO 密集型任务&#xff0c;例如使用 requests 库来爬取某个站点&#xff0c;当发出一个请求后&#xff0c;程序必须等待网站返回响应&#xff0c;才能接着运行&#xff0c;而在等待响应的过程中&#xff0c;整个爬虫程序是一直在等待的&#xff0c;实际上没有做…...

Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)

前言 本文最开始属于此文《视频生成Sora的全面解析&#xff1a;从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等》 但考虑到DiT除了广泛应用于视频生成领域中&#xff0c;在机器人动作预测也被运用的越来越多&#xff0c;加之DiT确实是一个比较大的创新&#xff0c;影响力大&…...

CPT203 Software Engineering 软件工程 Pt.2 敏捷方法和需求工程(中英双语)

文章目录 3. Aglie methods&#xff08;敏捷方法&#xff09;3.1 Aglie methods&#xff08;敏捷方法&#xff09;3.1.1 特点3.1.2 优点3.1.3 缺点3.1.4 原则3.1.5 计划驱动与敏捷方法的对比 3.2 Scrum3.2.1 Scrum roles3.2.2 Scrum Activities and Artifacts3.2.2.1 Product B…...

【Git】-- 在本地执行 git fetch 发生异常

目录 1、现象 2、解决参考 2.1 检查网络连接 2.2 更新 Git 客户端 2.3 更改 GitHub URL 的访问协议 2.4 禁用 SSL 验证&#xff08;临时解决&#xff09; 2.5 检查系统的 CA 证书 2.6 重新克隆仓库 1、现象 在本地执行 $ git fetch upstream 时&#xff0c;抛出以下…...

Apache Doris 创始人:何为“现代化”的数据仓库?

在 12 月 14 日的 Doris Summit Asia 2024 上&#xff0c;Apache Doris 创始人 & PMC 成员马如悦在开场演讲中&#xff0c;围绕“现代化数据仓库”这一主题&#xff0c;指出 3.0 版本是 Apache Doris 研发路程中的重要里程碑&#xff0c;他将这一进展总结为“实时之路”、“…...

高校网络安全存在的问题与对策研究

目 录 摘 要1 第1章 引言2 1.1研究背景2 1.2研究意义2 第2章系统开发的相关技术简介3 2.1 Spring boot框架3 2.2 MySQL简介3 2.3 Vue框架3 2.4 JAVA简介3 第3章 系统需求分析4 3.1可行性分析4 3.1.1技术可行性4 3.1.2运行可行性4 3.1.3经济可行性5 3.2功能需求…...