Spring Boot “约定大于配置”
什么是“约定大于配置”?
“约定大于配置”是一种简化开发的设计理念。简单来说,就是框架默认提供了常见的配置和行为,开发者只需要按照约定来编写代码,避免了繁琐的配置,只在需要时进行定制和调整。这种理念在Spring Boot中被充分体现,开发者可以专注于业务逻辑的开发,而不必在配置文件中花费大量精力
在Spring Boot中,这一理念通过自动配置(Auto Configuration)和默认约定得到了广泛应用,极大地简化了应用的搭建过程
Spring Boot 如何实现“约定大于配置”
-
自动配置
Spring Boot 的核心特性之一就是自动配置(Auto Configuration)。通过自动配置,Spring Boot会自动猜测和配置你所需要的组件。例如,假如你在类路径下包含了H2数据库的依赖,Spring Boot会自动配置一个内存中的H2数据库连接,不需要开发者手动配置数据源。如果没有找到合适的配置,Spring Boot也会给出默认的配置行为 -
内嵌服务器
Spring Boot 默认使用内嵌的Web服务器(如Tomcat、Jetty或Undertow)。这意味着开发者无需再手动配置Web服务器相关的bean,也不需要将其作为独立的应用部署在外部服务器上。你只需要创建一个SpringApplication.run(Application.class, args),Spring Boot会自动完成启动、配置和运行的所有过程 -
默认约定的目录结构
Spring Boot 提供了默认的目录结构,如:src/main/java用于存放Java源代码src/main/resources用于存放配置文件src/test用于存放测试代码
Spring Boot会默认按照这些目录结构来扫描和加载相关的文件,开发者不必做额外配置。
-
默认配置
Spring Boot的许多功能都有合理的默认配置。比如,Spring Boot自动根据你的应用依赖来配置常见的Bean和设置,如JPA、Web、Security等。如果你不做任何修改,它会自动启动并运行在默认配置下。这些默认值都能满足大多数开发场景,只有在业务上有特殊要求时才需要进行定制 -
Spring Boot Starter
Spring Boot 提供了大量的 "Starter" 依赖(如spring-boot-starter-web, spring-boot-starter-data-jpa等),这些 Starter 包含了一些典型的配置和常见的第三方库,使得开发者不必关心各种库的配置细节,只需要引入对应的 Starter 依赖即可。这种约定极大地降低了配置的复杂度
约定大于配置的优势
-
减少配置量
Spring Boot 的“约定大于配置”原则大大减少了开发时需要书写和管理的配置文件。你不必每次都进行复杂的配置,只需根据实际需要修改个别参数即可 -
提高开发效率
Spring Boot 提供了丰富的默认行为,使得开发者可以在短时间内搭建和启动应用,尤其是对于大多数常见的应用场景,Spring Boot 可以通过默认配置直接满足需求。开发者可以将更多的精力放在业务逻辑和功能实现上,而非基础设施的配置 -
降低错误率
通过约定,开发者减少了自定义配置的复杂度,减少了配置错误的风险。例如,Spring Boot 的自动配置可以自动绑定数据库连接信息,避免了手动配置时可能产生的错误 -
更易于上手
对于初学者来说,Spring Boot 提供的默认配置和自动配置可以让他们快速入门,不必理解框架内部的复杂配置和参数。即使是没有深入了解Spring框架的人,也能够通过遵循Spring Boot的约定来开发应用 -
可扩展性
在Spring Boot中,开发者可以根据需要轻松覆盖默认配置。如果某些默认行为不符合需求,可以通过自定义配置来调整或替代。比如,数据库的配置、Web服务器的配置等,都可以通过配置文件或代码来覆盖
约定大于配置的潜在问题
虽然“约定大于配置”原则带来了许多好处,但在一些情况下,也可能带来潜在的问题:
-
过度简化
Spring Boot 提供的自动配置虽然简化了很多开发流程,但有时也会隐藏一些细节,可能导致开发者对框架的运行原理了解不够深入,出现依赖于默认配置的情况。这对于一些复杂的应用场景可能不够灵活,需要开发者深入学习和调整 -
无法满足特殊需求
如果应用的需求比较特殊或与框架的默认配置不兼容,开发者可能需要手动配置和覆盖大量的默认行为。过多的自定义配置可能使得项目变得难以维护和管理 -
依赖于约定
如果开发者在项目中没有遵循Spring Boot的约定,就会失去框架的自动配置优势。比如,如果你没有按照Spring Boot默认的包结构来组织代码,框架可能无法自动扫描你的bean
如何调整Spring Boot的默认行为?
尽管Spring Boot遵循“约定大于配置”的原则,但在某些场景下,我们仍然可以根据需求进行调整:
-
修改
application.properties或application.yml文件
Spring Boot允许开发者通过配置文件来覆盖默认配置。例如,修改数据库连接、日志级别、端口号等配置项。你只需在配置文件中声明新的值,框架会自动读取并生效 -
使用自定义的自动配置
开发者可以创建自定义的自动配置类来覆盖或扩展默认的自动配置行为。通过使用@EnableAutoConfiguration和@Configuration注解,开发者可以自己定义一些自动配置逻辑,灵活定制应用的行为 -
显式配置
如果开发者不希望使用自动配置功能,可以通过@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})排除某些自动配置,或者直接使用显式配置
相关文章:
Spring Boot “约定大于配置”
什么是“约定大于配置”? “约定大于配置”是一种简化开发的设计理念。简单来说,就是框架默认提供了常见的配置和行为,开发者只需要按照约定来编写代码,避免了繁琐的配置,只在需要时进行定制和调整。这种理念在Spring…...
传输层协议TCP ( 下 )
文章目录 前言序号与确认序号超时重传RTOJacobson算法内核中超时时间的计算 滑动窗口滑动窗口延迟应答流量控制 拥塞控制慢启动拥塞避免快重传快速恢复 保活机制参考资料 前言 TCP(Transmission Control Protocol,传输控制协议)是互联网最重要…...
NLP 八股 DAY1:BERT
BERT全称:Pre-training of deep bidirectional transformers for language understanding,即深度双向Transformer。 模型训练时的两个任务是预测句⼦中被掩盖的词以及判断输⼊的两个句⼦是不是上下句。在预训练 好的BERT模型后⾯根据特定任务加上相应的⽹…...
演示synchronized锁机制用法的简单Demo
演示synchronized锁机制用法的简单Demo。我们以"银行开户"场景为例:每个用户只能创建一个账户(模拟类似原代码中每个用户只能有一个私有空间的限制)。 第1步:创建项目结构 demo-lock ├── src/main/java/com/exampl…...
Datawhale 数学建模导论二 笔记1
第6章 数据处理与拟合模型 本章主要涉及到的知识点有: 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论,如果对这部分内容不熟悉,可以参考相关概率论与数理统计的…...
差分解方程
差分解方程 差分法在数值求解偏微分方程(PDEs)和常微分方程(ODEs)时,可以分为隐式格式和显式格式。以下是两者的主要区别: 显式格式(Explicit Scheme) 时间推进: 显式格…...
EasyExcel 复杂填充
EasyExcel Excel表格中用{}或者{.} 来表示包裹要填充的变量,如果单元格文本中本来就有{、}左右大括号,需要在括号前面使用斜杠转义\{ 、\}。 代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和Excel中被{}包裹的变量名称一致。 …...
ESP32通过MQTT连接阿里云平台实现消息发布与订阅
文章目录 前言 一、准备工作 二、阿里云平台配置 三、代码实现 总结 前言 本文将介绍如何使用ESP32开发板通过MQTT协议连接阿里云物联网平台,并实现消息的发布与订阅功能。我们将使用Arduino IDE进行开发,并借助PubSubClient库实现MQTT通信。 一、准备…...
NVIDIA Jetson Orin Nano 刷机过程
1. 背景 新到手 NVIDIA Jetson Orin Nano 插上显示屏,显示如下: 这是UEFI Shell,UEFI Shell(统一可扩展固件接口外壳程序)是一种基于UEFI规范的交互式命令行工具,它运行在UEFI固件环境中,为用…...
C#学习之数据转换
目录 一、创作说明 二、数据类型之间的转换 1.数据类型之间的转换表格 2.代码示例 三、进制之间的转换 1.进制之间的转换表格 2.代码示例 四、ASCII 编码和字符之间的转换 1.ASCII 编码和字符之间的转换表格 2.代码示例 五、总结 一、创作说明 C#大多数时候都是和各…...
typecho快速发布文章
typecho_Pytools typecho_Pytools工具由python编写,可以快速批量的在本地发布文章,不需要登陆后台粘贴md文件内容,同时此工具还能查看最新的评论消息。… 开源地址: GitHub Gitee 使用教学:B站 一、主要功能 所有操作不用登陆博…...
深度学习R4周:LSTM-火灾温度预测
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 任务: 数据集中提供了火灾温度(Tem1)、一氧化碳浓度(CO 1)烟雾浓度(Soot 1)…...
探索Java中的集合类_特性与使用场景
1. 引言 1.1 Java集合框架概述 Java集合框架(Java Collections Framework, JCF)是Java中用于存储和操作一组对象的类和接口的统称。它提供了多种数据结构来满足不同的需求,如列表、集合、映射等。JCF的核心接口包括Collection、List、Set、Queue和Map,以及它们的各种实现…...
自动化遇到的问题记录(遇到问题就更)
总结回归下自己这边遇到的一些问题 “EOF错误”,获取不到csv里面的内容 跑多csv文件里的场景,部分场景的请求值为 1、检查csv文件里不能直接是[]开头的参数,把[]改到ms平台的请求参数里 2、有时可能是某个参数值缺了双引号的其中一边 met…...
【云安全】云原生- K8S kubeconfig 文件泄露
什么是 kubeconfig 文件? kubeconfig 文件是 Kubernetes 的配置文件,用于存储集群的访问凭证、API Server 的地址和认证信息,允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置,支持通过上下文&am…...
【愚公系列】《Python网络爬虫从入门到精通》008-正则表达式基础
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
【Linux】Ext2文件系统、软硬链接
Ext2文件系统 一.理解硬件1.磁盘、服务器、机柜、机房2.磁盘的物理结构3.磁盘的存储结构4.磁盘的逻辑结构1.理解过程2.真实过程 5.CHS地址、LBA地址转换 二.引入文件系统1.引入"块"概念2.引入"分区"概念3.引入"inode"概念 三.Ext2文件系统1.宏观…...
ATF系统安全从入门到精通
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573...
【算法专场】哈希表
目录 前言 哈希表 1. 两数之和 - 力扣(LeetCode) 算法分析 算法代码 面试题 01.02. 判定是否互为字符重排 编辑算法分析 算法代码 217. 存在重复元素 算法分析 算法代码 219. 存在重复元素 II 算法分析 算法代码 解法二 算法代码 算法…...
Beszel监控Docker安装
一、Beszel Hub安装 #Beszel Hub安装 mkdir -p ./beszel_data && \ docker run -d \--name beszel \--restartunless-stopped \-v ./beszel_data:/beszel_data \-p 8090:8090 \henrygd/beszel#创建账号 账号/密码:adminadmin.com/adminadmin.com 二、Besz…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
