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

Vim 调用外部命令学习笔记

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

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...