初识Spring Boot

初识Spring Boot

        SpringBoot是建立在Spring框架之上的一个项目,它的目标是简化Spring应用程序的初始搭建以及开发过程。

对比Spring

        Spring Boot作为Spring框架的一个模块,旨在简化Spring应用程序的初始搭建和开发过程,以下是Spring Boot相对于传统Spring框架的一些优势和劣势:

优势:

  • 简化配置: Spring Boot提供了大量的自动配置类,这些类可以自动配置Spring应用,减少了XML和Java配置代码的编写。
  • 快速启动:通过提供默认的配置和启动类,Spring Boot可以快速启动和运行Spring应用,无需进行复杂的配置。
  • 独立运行:Spring Boot应用包含内嵌的HTTP服务器(如Tomcat、Jetty或Undertow),可以打包成一个独立的JAR文件,用java -jar命令运行。
  • 无需XML配置:Spring Boot不需要使用XML配置文件,尽管它仍然支持XML配置,但推荐使用基于Java的配置。
  • 社区和插件生态:Spring Boot有一个活跃的社区,提供了大量的“Starters”或插件,这些插件简化了依赖管理和特定功能的集成。
  • 监控和管理:Spring Boot提供了多种监控和管理功能,如健康检査、度量信息收集等,这些功能可以通过actuator模块轻松实现。
  • 兼容性:Spring Boot与整个Spring生态系统兼容,可以很容易地集成Spring的其他项目,如’Spring Data、Spring Security等。

劣势:

  • 过度依赖自动配置:虽然自动配置简化了开发,但有时可能导致难以理解的配置问题,特别是在自动配置与手动配置混合使用时。
  • 可能的过度封装:Spring Boot的封装层次较深,对于需要深入了解底层实现的开发者来说,可能会感到不够透明。
  • 灵活性降低:在某些情况下,Spring Boot的自动配置可能会限制灵活性,特别是在需要对Spring框架进行精细控制的场景。
  • 版本依赖:Spring Boot应用的依赖管理虽然简化了,但过度依赖Spring Boot的版本可能会限制对Spring框架新特性的采用。
  • 不适合小型应用:对于一些非常简单的小型应用,使用Spring Boot可能会显得有些“杀鸡用牛刀”,因为即使是很小的应用也需要包含Spring Boot的整个生态。

Spring Boot项目目录

官方推荐项目目录结构

        互联网公司在开发Spring Boot项目时,通常会有一套规范的目录文件结构,这提高了代码的可读性和可维护性、实现了关注点分离、提升项目可扩展性。

下面的目录结构为官方推荐目录结构:

src/main/java:存放业务代码

src/main/resources:存放资源文件

static:存放静态文件,如css、js、image(访问方式:http:localhost:8080/js/main.js)

public:存放公共文件

templates:存放静态页面,如html、jsp

config:存放配置文件,如application.properties           

src/test:存放测试代码

启动类位置常见形式

        在初学Spring Boot时,经常遇到项目无法启动的奇怪现象,很有可能时应用启动的位置,即Application的启动类位置有问题。

Application启动的方式大致为三种:

  • 当启动类和controller在同一个类时,只需要在controller的类上添加注解@Controller即可。
  • 当启动类和controller分开时,启动类放在根目录下,只需要在启动类的类上添加注解@SpringBootApplication即可。
  • 当启动类和controller分开时,启动类放在非根目录下,只需要在启动类的类上添加注解@ComponentScan,并配置需要扫秒的包名即可。

        在实际的工作当中,我们通常会选择第二种,若项目庞大,漏掉了相关的配置扫描包,出现了问题是极其难以排查的。   

Spring Boot单元测试     

在软件上线之前,软件都需要经历测试这个流程,测试大致包括单元测试、黑白盒测试、回归测试、集成测试和系统测试。

单元测试:完成最小的软件设计单元的验证工作,目标是确保模块被正确的编码。

三大测试注解

@Test、@After、@Before 是 JUnit 框架中的注解,用于控制测试的执行流程和生命周期。

@Test

  • 作用:@Test 注解用于标记实际的测试方法。当你执行测试套件时,JUnit 会运行所有标记了@Test 注解的方法。
  • 生命周期:每次测试运行时,@Test 注解的方法都会被执行一次。
  • 目的:验证代码的特定行为或功能是否按预期工作。

@Before

  • 作用:@Before 注解用于标记在每个测试方法执行之前都会运行的方法。这通常用于设置测试环境,如初始化变量、配置测试数据等。
  • 生命周期:在每个 @Test 方法执行之前,JUnit 会先执行标记了 @Before 的方法。
  • 目的:确保每个测试方法都在一个干净和一致的环境中开始。

@After

  • 作用:@After 注解用于标记在每个测试方法执行之后都会运行的方法。这通常用于执行清理工作,如释放资源、删除测试数据等。
  • 生命周期:在每个 @Test 方法执行之后,JUnit 会执行标记了 @After 的方法。
  • 目的:确保测试完成后,测试环境被恢复到原始状态,以便其他测试方法不会受到干扰。

三大注解实践

        假设我们有一个简单的银行账户服务,该服务允许用户进行存款和取款操作,并跟踪账户余额。

        我们需要写一个BankAccountServiceTest的测试类来测试这个简单的银行账户服务。

BankAccountService
public class BankAccountService {private int balance;public BankAccountService() {this.balance = 0; // 初始余额为0}public void deposit(int amount) {balance += amount;}public boolean withdraw(int amount) {if (amount > balance) {return false;}balance -= amount;return true;}public int getBalance() {return balance;}
}

以上是简单的银行存取款业务。

BankAccountServiceTest
@SpringBootTest
public class BankAccountServiceTest {private BankAccountService account;@Beforepublic void setUp() {// 初始化银行账户服务account = new BankAccountService();System.out.println("初始化成功");}@Afterpublic void tearDown() {// 清理工作,这里没有特别需要清理的资源,但可以用于关闭连接、释放资源等account = null;System.out.println("任务完成,清理战场中...");}@Testpublic void testDeposit() {account.deposit(100);assertEquals("余额应该为100", 100, account.getBalance());}@Testpublic void testWithdraw() {account.deposit(200);assertTrue("取款100应该成功", account.withdraw(100));assertEquals("余额应该为100", 100, account.getBalance());}@Testpublic void testWithdrawInsufficientFunds() {account.deposit(50);assertFalse("取款100应该失败,因为余额不足", account.withdraw(100));assertEquals("余额应该保持为50", 50, account.getBalance());}
}
  • setup()方法在每个测试方法执行之前被调用,用于初始化BankAccountService实例。
  • tearDown ()方法在每个测试方法执行之后被调用,这里用于释放资源,虽然在这个简单的例子中没有需要特别释放的资源,但在实际应用中,这可能包括关闭数据库连接、停止服务等。
  • testDeposit()方法测试存款功能,验证账户余额是否正确增加。
  • testwithdraw()方法测试取款功能,首先存款,然后验证取款操作是否成功,并检查余额是否正确减少。
  • testwithdrawInsufficientFunds ()方法测试在余额不足时取款,验证操作是否失败,并检查余额是否保持不变。

        在我们运行后面这三个方法时,在每个方法之前都会运行setup()方法,每个方法之后都会运行tearDown ()方法。

测试结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/331629.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[datawhale202405]从零手搓大模型实战:TinyAgent

结论速递 TinyAgent项目实现了一个简单的Agent智能体,主要是实现了ReAct策略(推理调用工具的能力),及封装了一个Tool。 项目实现有一定的疏漏。为了正确运行代码,本次对代码Agent部分进行了简单修改(完善…

【Linux】Linux的安装

文章目录 一、Linux环境的安装虚拟机 镜像文件云服务器(可能需要花钱) 未完待续 一、Linux环境的安装 我们往后的学习用的Linux版本为——CentOs 7 ,使用 Ubuntu 也可以 。这里提供几个安装方法: 电脑安装双系统(不…

关于burp的intruder返回包空白问题

记录一下被自己蠢笑的问题 burp返回包为空怎么办,在查询无果后经过多次试验,确实没有效果 看那三个点还以为加载呢,攻击完了怎么一个显示没有 于是…… 鼠标到三个点,往下一拉 哈哈哈哈哈哈哈,真是被自己给蠢到了

基于地理坐标的高阶几何编辑工具算法(2)——相交面裁剪

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理后处理 工具步骤 选中一个需要裁剪的面,点击“相交面裁剪”工具,多选裁剪模板面,空格执行。 应用场景 常用于基于遥感影像的建筑物几何面编辑。 算法输入 一个待裁剪的面&a…

Mysql 备份恢复 mysqldump与xtrabackup备份

1.1 备份的原因 备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据 (取决于备份周期),但至少能将损失降到最低。衡量备份恢复有两个重要的指标:恢复点目标(RPO) 和恢复时间目标(RTO)&…

vue+elemntui 加减表单框功能样式

<el-form ref"form" :model"form" :rules"rules" label-width"80px"><el-form-item label"配置时间" prop"currentAllocationDate"><div v-for"(item,key) in timeList"><el-date…

实验一:通过路由器实现内外网互联

通过路由器实现内外网互联 一、实验拓扑 相关配置详见下图&#xff0c;内网区域为AR2以内设备&#xff0c;外网区域以AR1和PC1代替进行实验测试。 二、实验要求 通过路由器实现内外网互联&#xff1a; 1.各内网PC可自动获取ip地址&#xff1b; 2.各内网PC可ping通外网PC&…

认知架构 cognitive architecture

Assistants API&#xff1a;以开发人员为中心。 有状态的API&#xff1a;允许存储以前的消息、上传文件、访问内置工具&#xff08;代码解释器&#xff09;、通过函数调用控制其他工具。 认知架构应用的两个组件&#xff1a;&#xff08;1&#xff09;如何提供上下文给应用 &…

【DevOps】深入了解RabbitMQ:AMQP协议基础、消息队列工作原理和应用场景

目录 一、核心功能 二、优势 三、核心概念 四、工作原理 五、交换机类型 六、消息确认 七、持久性和可靠性 八、插件和扩展 九、集群和镜像队列 十、客户端库 十一、管理界面 十二、应用场景 RabbitMQ是一个基于AMQP协议的消息队列中间件&#xff0c;提供高可用、可…

C++ | Leetcode C++题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution { public:bool hasPathSum(TreeNode *root, int sum) {if (root nullptr) {return false;}if (root->left nullptr && root->right nullptr) {return sum root->val;}return hasPathSum(root->left…

el-table 划入划出方法

<template><div><el-table :data"tableData" style"width: 100%" cell-mouse-enter"handleMouseEnter" cell-mouse-leave"handleMouseLeave"><el-table-column prop"ddd" label"日期2" widt…

【TB作品】stm32单片机读取DS2401程序

DS2401是由Analog Devices公司生产的一种硅序列号芯片&#xff0c;它提供了一个绝对唯一的64位ROM识别码&#xff0c;用于确保可追溯性。以下是对DS2401器件的分析&#xff1a; 特点和优势&#xff1a; 唯一性&#xff1a;每个DS2401芯片都有一个独一无二的64位注册码&#x…

【实际项目精选源码】ehr人力资源管理系统实现案例(java,vue)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理运…

List Control控件绑定变量

创建基于对话框的mfc项目 添加 List Control控件 右击控件&#xff0c;选择“添加变量” 在初始化对话框代码中增加一些代码 BOOL CMFCApplication3Dlg::OnInitDialog() { //...// TODO: 在此添加额外的初始化代码DWORD dwStyle m_programLangList.GetExtendedStyle(); …

用户态下屏蔽全局消息钩子 —— ClientLoadLibrary 指针覆盖

目录 前言 一、研究 SetWindowsHookEx 的机制 二、概念验证 三、运行效果分析 四、总结与展望 参考文献 原文出处链接&#xff1a;[https://blog.csdn.net/qq_59075481/article/details/139206017] 前言 SetWindowsHookEx 函数帮助其他人员注入模块到我们的进程&#x…

PHP质量工具系列之php_CodeSniffer

PHP_CodeSniffer 是一组两个 PHP 脚本&#xff1a;主脚本 phpcs 对 PHP、JavaScript 和 CSS 文件进行标记&#xff0c;以检测是否违反定义的编码标准&#xff1b;第二个脚本 phpcbf 自动纠正违反编码标准的行为。PHP_CodeSniffer 是一个重要的开发工具&#xff0c;可以确保你的…

二叉树—先后序线索化和先后序线索遍历

有了上篇文章的基础&#xff0c;先序和后序的线索化逻辑一样。 代码如下&#xff1a; void preOrderThreadTree(TreeNode* T,TreeNode** pre) {if (T NULL) {;}else {//printf("%c ", T->val);if (T->lchild NULL) {T->ltag 1;T->lchild *pre;}if …

翻译《The Old New Thing》- What‘s the deal with the EM_SETHILITE message?

Whats the deal with the EM_SETHILITE message? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071025-00/?p24693 Raymond Chen 2007年10月25日 简要 文章讨论了EM_SETHILITE和EM_GETHILITE消息在文档中显示为“未实现”的原因。这些…

Python数字比大小获取大的数

目录 一、引言 二、数字比较的基本语法 三、获取较大的数 使用条件语句 使用内置函数 四、处理特殊情况 比较非数字类型 处理无穷大和NaN 五、应用实例 在游戏开发中比较分数 在数据分析中找出最大值 六、优化与性能 七、总结 一、引言 在Python编程的广阔天地中…

Redis 性能管理

一、Redis 性能管理 #查看Redis内存使用 172.168.1.11:6379> info memory 1. 内存碎片率 操作系统分配的内存值 used_memory_rss 除以 Redis 使用的内存总量值 used_memory 计算得出。内存值 used_memory_rss 表示该进程所占物理内存的大小&#xff0c;即为操作系统分配给…