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

如何提高单元测试的覆盖率

一、定位未覆盖的代码

  1. 利用 IDEA 的覆盖率工具​:

    • 右键测试类 → ​Run with Coverage,或使用 Alt+Shift+F10(Windows)打开运行菜单选择覆盖率。
    • 查看高亮标记​:
      • 绿色​:已覆盖代码行。
      • 红色​:未覆盖代码行。
      • 黄色​:部分覆盖(如条件分支未完全覆盖)。

    https://via.placeholder.com/600x400?text=IDEA+Coverage+Highlight

  2. 分析 JaCoCo 报告​:

    • 打开 target/site/jacoco/index.html,查看:
      • 行覆盖率​(Line):哪些行未执行?
      • 分支覆盖率​(Branch):哪些条件分支(如 if/else)未覆盖?
      • 方法覆盖率​:是否有未调用的方法?

二、针对性提升覆盖率的策略

策略 1:覆盖边界条件
  • 示例场景​:一个计算器类的方法 divide(int a, int b)
    public int divide(int a, int b) {if (b == 0) throw new IllegalArgumentException("除数不能为0");return a / b;
    }
  • 问题​:常规测试可能只覆盖 b≠0 的情况,遗漏了异常分支。
  • 解决方案​:
    @Test
    void testDivideByZero() {Calculator calculator = new Calculator();assertThrows(IllegalArgumentException.class, () -> calculator.divide(5, 0));
    }
策略 2:覆盖所有代码分支
  • 示例场景​:带有 if-else 的逻辑。
    public String getGrade(int score) {if (score >= 90) return "A";else if (score >= 60) return "B";else return "C";
    }
  • 问题​:若仅测试 score=80,则未覆盖 score≥90 和 score<60 的分支。
  • 解决方案​:使用参数化测试覆盖所有分支:
    @ParameterizedTest
    @CsvSource({"95, A", "75, B", "50, C"})
    void testGetGrade(int score, String expected) {assertEquals(expected, grader.getGrade(score));
    }
策略 3:覆盖异常和错误处理
  • 示例场景​:数据库操作失败时的回滚逻辑。
    public void saveData(Data data) {try {database.insert(data);} catch (SQLException e) {logger.error("保存失败", e);rollback();}
    }
  • 问题​:正常流程测试不会触发 catch 块。
  • 解决方案​:使用 Mockito 模拟异常:
    @Test
    void testSaveDataFailure() {Database mockDb = mock(Database.class);when(mockDb.insert(any())).thenThrow(new SQLException());DataService service = new DataService(mockDb);service.saveData(new Data());verify(mockDb).rollback(); // 验证是否执行了回滚
    }
策略 4:覆盖工具生成的代码
  • 常见问题​:Lombok 生成的 getter/setterequals/hashCode 或 IDE 自动生成的代码未覆盖。
  • 解决方案​:
    • 显式测试生成的代码(如验证 equals 方法)。
    • 配置 JaCoCo 忽略 Lombok 生成的代码(在 pom.xml 中):
      <configuration><excludes><exclude>​**​/*$Lombok*/​**​</exclude></excludes>
      </configuration>

三、高级技巧

技巧 1:强制覆盖难以触发的代码
  • 场景​:测试 private 方法或静态代码块。
    public class ConfigLoader {static {loadConfig(); // 静态代码块}private static void loadConfig() { /* 加载配置 */ }
    }
  • 解决方案​:通过反射调用私有方法或触发静态初始化:
    @Test
    void testStaticBlock() throws Exception {Class.forName("com.example.ConfigLoader"); // 触发静态代码块
    }
技巧 2:优化测试数据
  • 使用随机测试工具​:如 QuickTheories 或 jqwik,生成大量随机输入覆盖边缘情况。
    @Property
    void testRandomInput(@ForAll int a, @ForAll int b) {assumeTrue(b != 0); // 忽略 b=0 的情况assertEquals(a / b, calculator.divide(a, b));
    }
技巧 3:忽略无需覆盖的代码
  • 配置 JaCoCo 排除​(在 pom.xml 中):
    <excludes><exclude>​**​/model/*.java</exclude> // 忽略 POJO 类<exclude>​**​/Main.java</exclude>    // 忽略启动类
    </excludes>

四、避免常见误区

  1. 盲目追求 100% 覆盖率​:

    • 某些代码(如自动生成的代码、简单 Getter)无需强制覆盖。
    • 更关注核心逻辑和复杂分支的覆盖。
  2. 编写无效测试​:

    @Test
    void testAdd() {calculator.add(2, 3); // 没有断言!看似覆盖,实则无效
    }
  3. 忽略测试代码质量​:

    • 避免重复代码:用 @BeforeEach 初始化公共对象。
    • 遵循命名规范:测试方法名应明确表达场景(如 testDivide_WhenDivisorIsZero_ThrowException)。

五、总结

通过以下步骤系统提升覆盖率:

  1. 定位未覆盖代码​:使用 IDEA 高亮和 JaCoCo 报告。
  2. 设计针对性用例​:覆盖边界条件、异常分支、复杂逻辑。
  3. 利用工具和技巧​:参数化测试、Mock 异常、反射调用。
  4. 平衡覆盖率和成本​:优先覆盖关键代码,忽略无关部分。

相关文章:

如何提高单元测试的覆盖率

一、定位未覆盖的代码 ​利用 IDEA 的覆盖率工具​&#xff1a; 右键测试类 → ​Run with Coverage&#xff0c;或使用 AltShiftF10&#xff08;Windows&#xff09;打开运行菜单选择覆盖率。​查看高亮标记​&#xff1a; ​绿色​&#xff1a;已覆盖代码行。​红色​&#x…...

水位传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 三、程序设计 main.c文件 water.h文件 water.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 Water Sensor水位传感器是一款简单易用、性价比较高的水位/水滴识别检测传感器&#xff0c;其是通过具有一系列…...

linux服务器命令行获取nvidia显卡SN的方法

机房需要变更机器的GPU显卡配置&#xff0c;入库、出库几块显卡&#xff0c;库管让我去获取显卡序列号。 去现场拆机器的事情毕竟很麻烦&#xff0c;而且也没干过拆装服务器&#xff0c;即使拆下来显卡也不一定找到SN。 于是乎搜索&#xff1a;命令行怎么获取linux服务器上的…...

大模型微服务架构模块实现方案,基于LLaMA Factory和Nebius Cloud实现模型精调的标准流程及代码

以下是基于LLaMA Factory和Nebius Cloud实现模型精调的标准流程及代码示例&#xff0c;结合最新技术动态和行业实践整理&#xff1a; 一、LLaMA Factory本地部署方案 1. 环境配置 # 创建Python环境并安装依赖 conda create -n llama_factory python3.10 conda activate llam…...

每天学一个 Linux 命令(20):find

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/20/index.html find 是 Linux 系统中最强大的文件搜索工具之一,支持按名称、类型、时间、大小、权限等多种条件查找文件,并支持对搜索结果执行操作(如删除、复制、执行命令等)。掌握 find 可大幅提升文件管理效率…...

Kubernetes Pod 调度策略:从基础到进阶

文章目录 环境Kubernetes 部署Kubernetes Pod 调度策略Kubernetes Pod 调度策略对照表调度流程经历阶段案例展示生成yaml文件默认调度节点选择器为节点添加标签编写 Deployment 配置文件应用资源并查看调度结果 Node Affinity&#xff08;节点亲和性&#xff09;为节点添加标签…...

4.18学习总结

完成一道算法题 学习了序列化 敲代码卡bug了...

用于数学定理和逻辑推理的符号系统

当前用于数学定理和逻辑推理的前沿符号系统主要基于依赖类型论&#xff08;Dependent Type Theory&#xff09;&#xff0c;其中Lean 4和**Metamath Zero (MM0)**是最具代表性的新兴系统。以下从技术特性、使用方法和应用实例三个维度展开说明&#xff1a; 一、前沿符号系统解…...

HTTP:九.WEB机器人

概念 Web机器人是能够在无需人类干预的情况下自动进行一系列Web事务处理的软件程序。人们根据这些机器人探查web站点的方式,形象的给它们取了一个饱含特色的名字,比如“爬虫”、“蜘蛛”、“蠕虫”以及“机器人”等!爬虫概述 网络爬虫(英语:web crawler),也叫网络蜘蛛(…...

代码学习总结(五)

代码学习总结(五) 这个系列的博客是记录下自己学习代码的历程,有来自平台上的,有来自笔试题回忆的,主要基于 C++ 语言,包括题目内容,代码实现,思路,并会注明题目难度,保证代码运行结果 1 小红的好数 简单 非退化三角形 快速匹配 小红定义一个数对 { x , y } \{x…...

在 Vue 3 项目中引入 js-cookie 库

1. 安装 js-cookie 你可以通过 npm 或者 yarn 来安装 js-cookie&#xff1a; npm install js-cookie # 或者 yarn add js-cookie2. 在组件里引入并使用 js-cookie 以下给出两种使用方式&#xff1a; 全局引入 在 main.js 中全局引入 js-cookie&#xff0c;这样在所有组件里…...

HarmonyOs学习 环境配置后 实验1:创建项目Hello World

HarmonyOS开发入门&#xff1a;环境配置与Hello World实验 实验目标 掌握HarmonyOS开发环境配置&#xff0c;创建首个HarmonyOS应用并实现"Hello World"界面展示 实验准备 已安装DevEco Studio开发环境已配置HarmonyOS开发依赖项熟悉基本TypeScript/ArkTS语法&am…...

Spark on K8s 在 vivo 大数据平台的混部实战与优化

一、Spark on K8s 简介 (一)定义与架构 Spark on K8s 是一种将 Spark 运行在 Kubernetes(K8s)集群上的架构,由 K8s 直接创建 Driver 和 Executor 的 Pod 来运行 Spark 作业。其架构如下。 Driver Pod:相当于 Spark 集群中的 Driver,负责作业的调度和管理,它会根据作业…...

《软件设计师》复习笔记(13)——结构化开发方法

目录 1. 结构化开发方法 1.1 系统分析过程 1.2 系统设计基本原理 &#xff08;1&#xff09;内聚性&#xff08;模块内部关联程度&#xff09; &#xff08;2&#xff09;耦合性&#xff08;模块间依赖程度&#xff09; 真题示例&#xff1a; 1.3 系统总体结构设计&…...

Android创建测试配置和生产配置

Android测试与生产环境配置指南 在Android开发中&#xff0c;创建不同的构建配置来适应测试和生产环境是至关重要的。这样的配置能让我们在不同的开发阶段有效管理代码、资源和环境变量。本文将详细介绍如何在Android中创建和管理测试配置以及生产配置的整个过程。 环境准备 …...

DBeaver连接hive

DBeaver是一个非常好用的数据库管理工具&#xff0c;支持多种不同的数据库类型。 dbeaver 要连接hive时&#xff0c;数据库驱动是无法下载&#xff0c;但在hive 的安装配置包中&#xff0c;有一个目录&#xff1a;jdbc里面有一个专门提供外部程序连接hive的jar。将这个jar下载…...

数据结构初阶:二叉树(二)

本篇博客主要讲解二叉树---堆的相关知识。 1.实现顺序结构二叉树 一般堆使用顺序结构的数组来存储数据&#xff0c;堆是一种特殊的二叉树&#xff0c;具有二叉树的特性的同时&#xff0c;还具备其他的特性。 1.1 堆的概念和结构 堆具有以下性质&#xff1a; 堆中某个结点的值…...

React 列表渲染基础示例

React 中最常见的一个需求就是「把一组数据渲染成一组 DOM 元素」&#xff0c;比如一个列表。下面是我写的一个最小示例&#xff0c;目的是搞清楚它到底是怎么工作的。 示例代码 // 定义一个静态数组&#xff0c;模拟后续要渲染的数据源 // 每个对象代表一个前端框架&#xf…...

android PackageName ClassName

目录 系统应用: 设置 蓝牙 时钟 计算机 录音机 图库 视频 文件管理 FM 日历 谷歌浏览器 谷歌商店 热门商店 国外应用: amazon spotify deezer pandora audible applemusic omnia mxtech youtubemusic facebook familylink tidal tiktok kindle 系统应用: 设置 …...

万物对接大模型:【爆火】MCP原理与使用指南

###原文链接 OpenAI、谷歌、微软、阿里云、腾讯云、百度等国内外各大厂商都陆续宣布支持MCP服务。MCP是什么&#xff0c;为什么能获得高度的关注&#xff1f; MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司(核心产品是Claude大模型)推出的一种开源协议&#xf…...

SAP系统中MD01与MD02区别

知识点普及&#xff0d;MD01与MD02区别 1、从日常业务中&#xff0c;我们都容易知道MD01是运行全部物料&#xff0c;MD02是运行单个物料 2、在做配置测试中&#xff0c;也出现过MD02可以跑出物料&#xff0c;但是MD01跑不出的情况。 3、MD01与MD02的差异: 3.1、只要在物料主数…...

python——字符串使用

目录 1、字符串表示 2、转义字符 &#xff08;1&#xff09;将一些具有特殊含义的字符&#xff0c;标识成普通的字符&#xff08;\&#xff09; &#xff08;2&#xff09;特殊的控制符 &#xff08;3&#xff09;&#xff08;\&#xff09;还可以表示python中续行符 3、…...

嵌入式ARM RISCV toolchain工具 梳理arm-none-eabi-gcc

嵌入式TOOLchain工具 梳理 简介 本文总结和梳理一下一些toolchain的规则和原理&#xff0c;方便后续跨平台的时候&#xff0c;给大家使用toolchain做一个参考。 解释如何理解arm-none-eabi-gcc等含义&#xff0c;以及如何一看就知道该用什么编译器。 当然如果有哪里写的不是…...

团体程序设计天梯赛PTA-SHU冲刺赛4. L22-L32

这是4.18 SHU备赛天梯赛的最后一场冲刺赛 10.病毒溯源 1.本题PTA中拓栈后会MTL&#xff0c;不拓栈会报非零返回 所以本题最好用栈模拟递归过程 2.源头得是入度为0的&#xff0c;也就是没有节点指向它 所以得设置inn是否有指向该节点 3.这题用dfs&#xff08;用bfs的话不同…...

【数据结构与算法】——插入排序

概要 本文将介绍插入排序方法——直接插入、希尔排序 想了解数据结构其他内容&#xff0c;本人主页 恋风诗 获取源码&#xff0c;gitte仓库&#xff1a;mozhengy 正文 1.排序的分类 目前将主要介绍下面几种排序&#xff1a; 后续学习更多内容后会及时更新 2、插入排序 2…...

手撕STL——vector

目录 引言 1&#xff0c;了解 STL 中的 vector 2&#xff0c;先来一个简易版跑起来 2_1&#xff0c;构造函数 2_2&#xff0c;扩容reserve&#xff08;&#xff09; 2_3&#xff0c;push_back&#xff08;&#xff09; 2_4&#xff0c;pop_back&#xff08;&#xff09; …...

新书速览|DeepSeek移动端AI应用开发:基于Android与iOS

《DeepSeek移动端AI应用开发&#xff1a;基于Android与iOS》 1 本书内容 《DeepSeek移动端AI应用开发:基于Android与iOS》深入剖析了DeepSeek平台的架构原理、API调用及开发实践等核心内容&#xff0c;助力读者在Android与iOS移动端高效集成DeepSeek API&#xff0c;打造出契…...

详解STM32时基单元中参数 TIM_ClockDivision 的含义

在 STM32 定时器时基单元配置中&#xff0c;TIM_TimeBaseInitStruct->TIM_ClockDivision 用于设置 定时器时钟的分频系数&#xff0c;主要影响 输入捕获滤波器 和 输出比较同步信号 的时钟分割。以下是其核心作用、参数含义及应用场景的详细解析&#xff1a; 一、核心作用&…...

黑马V11版 最新Java高级软件工程师课程-JavaEE精英进阶课

课程大小&#xff1a;60.2G 课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/90615581 更多资源下载&#xff1a;关注我 阶段一 中台战略与组件化开发专题课程 阶段二 【物流行业】品达物流TMS 阶段三 智牛股 阶段四 千亿级电商秒杀解决方案专题 …...

【Win】 cmd 执行curl命令时,输出 ‘命令管道位置 1 的 cmdlet Invoke-WebRequest 请为以下参数提供值: Uri: ’ ?

1.原因&#xff1a; 有一个名为 Invoke-WebRequest 的 CmdLet&#xff0c;其别名为 curl。因此&#xff0c;当您执行此命令时&#xff0c;它会尝试使用 Invoke-WebRequest&#xff0c;而不是使用 curl。 2.解决办法 在cmd中输入如下命令删除这个curl别名&#xff1a; Remov…...

【k8s系列4】工具介绍

1、虚拟机软件 vmware workstation 2、shell 软件 MobaXterm 3、centos7.9 下载地址 &#xff08;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.374bf5adOaiFPW&#xff09; 4、上网软件...

设计模式 --- 装饰器模式

装饰模式是一种结构型设计模式&#xff0c;它允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰类&#xff0c;用来包装原有的类&#xff0c;并在保持类方法签名完整性的前提下&#xff0c;提供了额外的功能。 优点&#xff1a; 1.灵…...

docker.desktop下安装普罗米修斯prometheus、grafana并看服务器信息

目标 在docker.desktop下先安装这三种组件,然后显示当前服务的CPU等指标。各种坑已踩,用的是当前时间最新的镜像 核心关系概述 组件角色依赖关系Prometheus开源监控系统,负责 数据采集、存储、查询及告警。依赖 Node-Exporter 提供的指标数据。Node-Exporter专用的 数据采集…...

学习设计模式《二》——外观模式

一、基础概念 1.1、外观模式的简介 外观模式的本质是【封装交互、简化调用】&#xff1b; 外观模式的说明&#xff1a;就是通过引入一个外观类&#xff0c;在这个类里面定义客户端想要的简单方法&#xff0c;然后在这些方法里面实现&#xff1b;由外观类再去分别调用内部的多个…...

python中,处理多分类时,模型之间的参数设置

在Python的机器学习库中&#xff0c;处理多分类问题时&#xff0c;不同的模型可能会有不同的参数设置来适应多分类场景。这里列举几个常见模型及相关的多分类参数&#xff1a; 1. Logistic Regression (逻辑回归) 在Scikit-Learn库中&#xff0c;逻辑回归模型可以通过设置mul…...

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(四级)真题

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;四级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 答案解析&#xff1a;https://blog.csdn.net/qq_33897084/article/details/147341407 一、单选题(共25题&#xff0c;共50分) 1. 下列程序段…...

蓝桥杯12. 日期问题

日期问题 原题目链接 题目描述 小明正在整理一批历史文献。这些历史文献中出现了很多日期。 小明知道这些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日 之间。 令小明头疼的是&#xff0c;这些日期采用的格式非常不统一&#xff1a; 有的采用 年/月/日有的采用 月…...

【MATLAB代码例程】AOA与TOA结合的高精度平面地位,适用于四个基站的情况,附完整的代码

本代码实现了一种基于到达角(AOA) 和到达时间(TOA) 的混合定位算法,适用于二维平面内移动或静止目标的定位。通过4个基站的协同测量,结合最小二乘法和几何解算,能够有效估计目标位置,并支持噪声模拟、误差分析和可视化输出。适用于室内定位、无人机导航、工业监测等场景…...

ARINC818协议(五)

1.R_CTL,设置固定的0x44即可 2.Dest_ID:目的地D_ID,如果不需要目的地址&#xff0c;就设置为0&#xff1b;ADVB协议支持 多个视频目的地址&#xff0c;广播通信; 3.cs_ctl在FC-AV上不用 4.source_ID:S_ID [23:0]包含源实体的端口的地址标识&#xff1b;不用就设置为0. ADVB允许…...

国产品牌芯洲科技100V降压芯片系列

SCT2A25采用带集成环路补偿的恒导通时间(COT)模式控制&#xff0c;大大简化了转换器的片外配置。SCT2A25具有典型的140uA低静态电流&#xff0c;采用脉冲频率调制(PFM)模式&#xff0c;它使转换器在轻载或空载条件下实现高转换效率。 芯洲科技100V降压芯片系列提供丰富的48V系…...

遨游科普:三防平板除了三防特性?还能实现什么功能?

在工业4.0浪潮席卷全球的今天&#xff0c;电子设备的功能边界正经历着革命性突破。三防平板电脑作为"危、急、特"场景的智能终端代表&#xff0c;其价值早已超越防水、防尘、防摔的基础防护属性。遨游通讯通过系统级技术创新&#xff0c;将三防平板打造为集通信中枢、…...

边缘计算网关组态功能的定义

边缘计算网关组态功能的定义 边缘计算网关组态是指根据特定的应用场景和需求&#xff0c;对边缘计算网关进行配置和定制的过程。它涵盖了硬件接口的选择、软件功能的设定、通信协议的配置以及数据处理流程的设计等多个方面&#xff0c;旨在使网关设备更加贴合实际应用场景&…...

数据可视化笔记:柱状图

数据可视化笔记&#xff1a;柱状图与饼图 1.1 一、基础配置 在进行数据可视化之前&#xff0c;需要对Matplotlib进行一些基础配置&#xff0c;以确保图表能够正确显示中文以及设置合适的分辨率和大小。 from matplotlib import pyplot as plt import numpy as np# 设置中文字…...

珈和科技:无人机技术赋能智慧农业,精准施肥与病虫害监控全面升级

无人机技术在农业领域的兴起&#xff0c;是现代技术发展为传统农业带来的重要变革。目前&#xff0c; 无人机已成为农业生产中不可或缺的关键工具&#xff0c;在提高粮食产量、改善土壤健康和保护生态环境等方面提供了新的解决方案。珈和科技从无人机的类型、特点和监测系统入手…...

UR5e机器人动力学

机器人动力学研究力与运动之间的关系,核心目标是建立关节力矩与关节位置、速度、加速度的数学关系。动力学模型通常分为: 正向动力学:已知关节力矩,计算末端执行器的运动(加速度)。 逆向动力学:已知期望的运动(位置、速度、加速度),计算所需的关节力矩。 https://www…...

【go】什么是Go语言的GPM模型?工作流程?为什么Go语言中的GMP模型需要有P?

Go语言GMP调度模型详解 一、GMP模型核心概念 Go语言的GMP模型是一种高效的轻量级线程管理调度系统&#xff0c;由三个核心组件构成&#xff1a; G (Goroutine)&#xff1a; 轻量级协程&#xff0c;初始栈仅2KB&#xff08;可动态扩容&#xff09;用户态调度&#xff0c;创建成…...

X-AnyLabeling开源程序借助 Segment Anything 和其他出色模型的 AI 支持轻松进行数据标记。

一、软件介绍 文末提供源码和程序下载学习 使用 X-AnyLabeling开源程序可以 导入、管理和保存数据。用户可以通过多种方式导入图像和视频文件&#xff0c;包括快捷方式或菜单选项。此外&#xff0c;它还涵盖数据删除、图像切换以及标签和图像数据的保存&#xff0c;以确保高效…...

简易 Python 爬虫实现,10min可完成带效果源码

目录 准备工作 编写爬虫代码 运行爬虫 查看结果 遇到的问题及解决 总结 前言和效果 本文记录了使用 Python 实现一个简单网页爬虫的过程&#xff0c;目标是爬取 quotes.toscrape.com 的名言和作者&#xff0c;并将结果保存到文本文件。以下是完整步骤&#xff0c;包含环境…...

全志H5,NanopiKP1lus移植QT5.12记录

移植步骤 机器环境下载QT5.12.0源码安装交叉编译器修改qmake.conf文件配置编译选项qt5的configure选项说明基本配置选项编译器和链接器选项功能模块配置第三方库集成注意事项 配置过程报错解决配置完成编译过程报错解决编译完成将arm-qt文件夹传送到开发板配置板子环境变量运行…...

Spring Boot 依赖注入与Bean管理:JavaConfig如何取代XML?

大家好呀&#xff01;今天我们来聊一个超级实用的技术话题 —— Spring Boot 中的依赖注入和Bean管理&#xff0c;特别是JavaConfig是如何一步步取代XML配置的。我知道很多小伙伴一听到"依赖注入"、"Bean管理"这些词就头大&#xff0c;别担心&#xff01;我…...