当前位置: 首页 > 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 提示: 二叉树的节点个数的范围是 …...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...