初识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脚…

接口设计的十八条规范

目录 1.签名2.加密3.IP白名单4.限流5.参数校验6.统一返回值7.统一封装异常8.请求日志9.幂等设计10.限制记录条数11.压测12.异步处理13.数据脱敏14.完整的接口文档15.请求方式16.请求头17.批量操作18.职责单一 1.签名 目的:防止数据被篡改。 方法: 接口请…

概率论统计——大数定律

大数定律 弱大数定律(辛钦大数定律) 利用切比雪夫不等式,证明弱大数定律 应用 伯努利大数定理,(辛钦大数定理的推论) 证明伯努利大数定理 注意:这里将二项分布转化成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…

LeetCode 热题 100 介绍

"LeetCode热题100"通常是指LeetCode上被用户频繁练习和讨论的100道热门题目。这些题目往往对于面试准备和算法学习非常有帮助。 哈希 两数之和 难度:简单链接🔗: 这 字母异位词分组 难度:中等链接🔗&#x…

题解: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 …

springboot项目跨域设置总结

方式一&#xff1a; Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 允许跨域的路径.allowedOrigins("*") // 允许跨域请求的域名.al…

高校电动自行车充电桩管理系统-手把手调试搭建

高校电动自行车充电桩管理系统-手把手调试搭建 高校电动自行车充电桩管理系统-手把手调试搭建

【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…

SD3314A降压恒流LED驱动器电压降压2.5V-6.0V标准电源

该SD3314A是一个降压恒流LED驱动器。当输入电压降到低于LED正 向电压时&#xff0c;则SD3314A进入LDO模式运行 该SD3314A支持的输入电压范围从2.5V至6.0V&#xff0c;允许使用一个单一 的锂/锂聚合物电池&#xff0c;3AA或4AA电池&#xff0c;USB和其他标准电源 FB电压仅为0.1V…

基于开源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;它同时也是…

JAVA给一个JSON数组添加对象

操作Mysql表的json字段&#xff0c;查询json字段的内容&#xff0c;将新增的内容添加到查询的json数组中 String a "[{\"name\": \"张三\", \"age\": 10, \"gender\": \"男\", \"email\": \"123qq.co…

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

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

【华为OD机试-C卷D卷-200分】二叉树的广度优先遍历(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。 现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点-&…

9.任务调度

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