初识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.mzph.cn/diannao/15805.shtml

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

相关文章

AI视频教程下载:用提示工程在GPT商店构建10个GPTs

你将学到什么? 深入了解ChatGPT平台和GPT商店的生态系统。 开发为多样化应用定制GPT模型的专业知识。 掌握高效内容生成的AI自动化技术。 学习高级提示工程以优化ChatGPT输出。 获取构建AI驱动的数字营销和广告解决方案的技能。 了解如何为SEO写作和优化创建专…

Redis篇 redis基本命令和定时器原理

基本命令和定时器原理 一. exists命令二. del命令三. Expire命令四. ttl命令五. redis的过期策略六. 定时器的两种设计方式七. type命令 一. exists命令 用来判断key的值是否存在 返回值是key的个数 这样写的话,有没有什么区别呢? 效率变低,消…

AI办公自动化:用kimi将子文件夹里面的文件批量重命名

工作任务和目标:一个文件夹下有多个子文件夹 子文件夹中有多个srt文件,需要删除文件名中的english和空格 第一步,在kimi中输入如下提示词: 你是一个Python编程高手,一步步的思考,来编写下面任务的Python脚…

概率论统计——大数定律

大数定律 弱大数定律(辛钦大数定律) 利用切比雪夫不等式,证明弱大数定律 应用 伯努利大数定理,(辛钦大数定理的推论) 证明伯努利大数定理 注意:这里将二项分布转化成0,1分布来表示,…

按月爬取天气数据可视化展示

从天气网分析,可以查询每个月的天气情况,这里按照url规则,传入年月,获取数据,最后进行可视化展示,最终效果: 下面是获取过程: 第一步: import requestsdef get_weather(month):url = f"https://lishi.tianqi.com/nanning/{month}.html"response = reques…

从0开始学统计-多个婴儿连续夭折是谋杀吗?

1.什么是小概率事件? 小概率事件是指在一次随机试验中发生概率非常低的事件。一般来说,小概率事件的发生概率远低于一定的阈值,通常取0.05或0.01。在统计学中,这些阈值被称为显著性水平(significance level&#xff0…

题解:CF1016E Rest In The Shades

题意 平面上有一个点光源 s s s 并以每秒 1 1 1 单位长度的速度从点 ( a , s y ) (a,sy) (a,sy) 移动到点 ( b , s y ) (b,sy) (b,sy)&#xff0c;其中 s y < 0 sy<0 sy<0&#xff1b;在 x x x 轴正方向上有 n n n 不相交、不接触的挡板&#xff0c;第 i i i …

【Spring Boot】响应式编程

响应式编程 1.WebFlux2.比较 MVC 和 WebFlux2.1 工作方式2.2 Spring MVC 与 Spring WebFlux 的区别2.3 使用 WebFlux 的好处 3.Mono 和 Flux3.1 Mono 和 Flux 是什么3.2 Mono 和 Flux 的区别 4.开发 WebFlux 的流程4.1 注解式开发流程4.2 响应式开发流程 5.用注解式开发实现 He…

基于开源ATmega8 无感BLDC程序移植到ATmega328PB

基于开源ATmega8 无感BLDC程序移植到ATmega328PB &#x1f516;基于Atmel Studio 7.0开发环境。&#x1f955;开源原项目资源地址&#xff1a;https://svn.mikrokopter.de/websvn/listing.php?repnameBL-Ctrl&path%2F&&#x1f4cd;原理图和PCB资源 BL-Ctrl v2.0 in E…

Win32 API

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏 : C语言 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 一.Win32 API 1.Win32 API介绍 Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外&#xff0c;它同时也是…

Redis内存回收-内存淘汰策略

LFU的访问次数之所以叫做逻辑访问次数&#xff0c;是因为并不是每次key被访问都计数&#xff0c;而是通过运算&#xff1a; 生成0~1之间的随机数R计算 (旧次数 * lfu_log_factor 1)&#xff0c;记录为P如果 R < P &#xff0c;则计数器 1&#xff0c;且最大不超过255访问…

9.任务调度

一、开启任务调度器 1.函数 vTaskStartScheduler() 函数 vTaskStartScheduler()用于启动任务调度器&#xff0c;任务调度器启动后&#xff0c;FreeRTOS 便会开始 进行任务调度&#xff0c;除非调用函数 xTaskEndScheduler()停止任务调度器&#xff0c;否则不会再返回。函数 vTa…

Centos修改系統語言

一、使用命令行修系统语言 1、显示系统当前语言环 [rootkvm-suma ~]# localectl System Locale: LANGen_US.utf8 VC Keymap: cn X11 Layout: cn 2、查看系统支持字符集 [rootkvm-suma ~]# locale -a 2、设置系统语言环境 [rootkvm-suma ~]# localectl set-locale LANGz…

【GESP试卷】2024年03月Scratch四级试卷

2024年GESP03月认证Scratch四级试卷 分数&#xff1a;100 题数&#xff1a;27 一、单选题(共15题&#xff0c;每题2分&#xff0c;共30分) 010203040506070809101112131415CDBBACBCDCDADBA 1、小杨的父母最近刚刚给他买了一块华为手表&#xff0c;他说手表上跑的是鸿蒙&…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充 插件IDEAVsCode MavenvagrantDocker解决MySQL连接慢问题启动&#xff08;自动&#xff09;Docker注意切换到root用户远程访问MySQL MyBatisPlus代码地址参考 插件 IDEA Mybati…

【数据挖掘】四分位数识别数据中的异常值(附代码)

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

STM32F1之OV7725摄像头

目录 1. 摄像头简介 2. OV7725 摄像头简介 3. OV7725 引脚 4. OV7725 功能框架图 5. SCCB时序 5.1 SCCB 的起始、停止信号及数据有效性 5.2 SCCB 数据读写过程 1. 摄像头简介 在各类信息中&#xff0c;图像含有最丰富的信息&#xff0c;作为机…

SVM原问题与对偶问题

目的&#xff1a;求出我们的f(X)&#xff0c;它代表着我们X映射到多维的情况&#xff0c;能够帮我们在多维中招到超平面进行分类。 1.优化问题&#xff1a; 1.1推荐好书&#xff1a; 1.2 优化理论中的原问题&#xff1a; 原问题和限制条件如下&#xff1a; 这是一个泛化性…

【漏洞复现】英飞达医学影像存档与通信系统 WebJobUpload 任意文件上传漏洞

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communicaton System&#xff0c;它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像(包括核磁&#xff0c;CT&#xff0c;超声&#xff0c;各种X光机&#xff0c;各种红外仪…

LeetCode - 数组 - 四数之和

题目地址 描述 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#x…