初识Spring Boot

news2025/3/14 20:44:28

初识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;

    @Before
    public void setUp() {
        // 初始化银行账户服务
        account = new BankAccountService();
        System.out.println("初始化成功");
    }

    @After
    public void tearDown() {
        // 清理工作,这里没有特别需要清理的资源,但可以用于关闭连接、释放资源等
        account = null;
        System.out.println("任务完成,清理战场中...");
    }

    @Test
    public void testDeposit() {
        account.deposit(100);
        assertEquals("余额应该为100", 100, account.getBalance());
    }

    @Test
    public void testWithdraw() {
        account.deposit(200);
        assertTrue("取款100应该成功", account.withdraw(100));
        assertEquals("余额应该为100", 100, account.getBalance());
    }

    @Test
    public 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.coloradmin.cn/o/1695341.html

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

相关文章

【通义千问—Qwen-Agent系列2】案例分析(图像理解图文生成Agent||多模态助手|| 基于ReAct范式的数据分析Agent)

目录 前言一、快速开始1-1、介绍1-2、安装1-3、开发你自己的Agent 二、基于Qwen-Agent的案例分析2-0、环境安装2-1、图像理解&文本生成Agent2-2、 基于ReAct范式的数据分析Agent2-3、 多模态助手 附录1、agent源码2、router源码 总结 前言 Qwen-Agent是一个开发框架。开发…

iZotope RX 11 for Mac:音频修复的终极利器

在音频处理的世界里,纯净与清晰是每一个创作者追求的目标。iZotope RX 11 for Mac,这款专为Mac用户打造的音频修复软件,凭借其卓越的音频修复能力和丰富的功能,已经成为众多音频工程师和音乐制作人的首选工具。 iZotope RX 11 for…

线程生命周期

创建线程的两种方法 1.继承Thread类 2.实现Runnable接口 线程从创建到消亡分为新建、就绪、运行、阻塞、死亡5种状态。 新建状态 创建一个线程就处于新建状态。此时线程对象已经被分配了内存空间,并且私有数据也被初始化,但是该线程还不能运行。 就…

nodeJs学习(第一周)

文章目录 学习总结nodejs基础知识核心模块(内置模块)fs(file-system)文件系统fs增删查改urlQuery String httprequest根据不同的请求路径发送不同的响应结果requireip地址和端口号Content-Type 第三方模块 express登录接口逻辑分析…

【LeetCode:2769. 找出最大的可达成数字 + 模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

MySQL--执行计划

一、执行计划 1.介绍 执行计划是sql在执行时,优化器优化后,选择的cost最低的方案 通过desc、explain可以查看sql的执行计划 2.如何查看执行计划 table语句操作的表,在多表时才有意义type查找类型possible_keys可能会用到的索引key最终选择的…

基于python数据挖掘在淘宝评价方面的应用与分析,技术包括kmeans聚类及情感分析、LDA主题分析

随着电子商务的蓬勃发展,淘宝作为中国最大的在线购物平台之一,吸引了大量的消费者进行购物并留下了大量的客户评价。这些客户评价中包含了丰富的消费者意见和情感信息,对于商家改进产品、提升服务质量以及消费者决策都具有重要的参考价值。 …

JVM学习-垃圾回收(一)

什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾如果不及时对内存的垃圾进行清理,垃圾对象所占用的内存空间会一直保留到应用程序结束,被保留的空间无法被其它对象所用,甚至可能导致内存溢…

视频批量剪辑神器大揭秘:一键删减片头片尾,高效打造精彩视频内容!

在数字化时代的浪潮中,视频已经成为人们传递信息、分享生活的重要载体。无论是制作一部精美的宣传片,还是剪辑一段有趣的短视频,视频时长都是至关重要的因素。然而,很多视频创作者在调整视频时长时遇到了困难,耗费了大…

实体-联系图

为了把用户的数据要求清楚、准确地描述出来,系统分析员通常建立一个概念性的数据模型(也称为信息模型)。概念性数据模型是一种面向问题的数据模型,是按照用户的观点对数据建立的模型。它描述了从用户角度看到的数据,它反映了用户的现实环境, 而且与在软件系统中的实现方法无关。…

计算几何-扫描线算法

1、定义 计算几何中,扫描线算法(Sweep Line Algorithm)或平面扫描算法(Plane Sweep Algorithm)是一种算法模式,虚拟扫描线或扫描面来解决欧几里德空间中的各种问题,一般被用来解决图形面积&am…

Java面试八股之Synchronized和ReentrantLock的区别

Synchronized和ReentrantLock的区别 实现级别: synchronized是Java的一个关键字,属于JVM层面的原生支持,它通过监视器锁(Monitor)来实现同步控制,无需手动获取和释放锁。 ReentrantLock是java.util.conc…

免费插件集-illustrator插件-Ai插件-文本对象和文本段落互转

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,进行文本对象和文本段落互转。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/878…

【408真题】2009-16

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

计算机毕业设计Hadoop+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据

2024 届本科毕业论文(设计) 基于Hadoop的地震预测的 分析与可视化研究 姓 名:____田伟情_________ 系 别:____信息技术学院___ 专 业:数据科学与大数据技术 学 号:__2011103094________ 指导…

Sam Altman微软Build 2024最新演讲:AI可能是下一个移动互联网

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

vue+echart :点击趋势图中的某一点或是柱状图,出现弹窗,并传输数据

样式 在趋势图中点击某一个柱状图,出现下面的弹窗 代码实现 主要是在趋势图页面代码中,在初始化趋势图的设置中,添加对趋势图监听的点击方法 drawChart() {const chartData this.chartData;let option {};if (!chartData.xData?.len…

【LVGL_Linux安装NXP的Gui-Guider】

GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的方式设计LVGL GUI页面,加速GUI的设计。 虽然他只支持自家芯片,但是应用层我们可以直接拿来用作其他MCU上。 GUI-Guider 下载 NXP官网下载:链接&#xff1…

SpringBoot 集成 ChatGPT(附实战源码)

建项目 项目结构 application.properties openai.chatgtp.modelgpt-3.5-turbo openai.chatgtp.api.keyREPLACE_WITH_YOUR_API_KEY openai.chatgtp.api.urlhttps://api.openai.com/v1/chat/completionsopenai.chatgtp.max-completions1 openai.chatgtp.temperature0 openai.cha…

超值分享50个DFM模型格式的素人直播资源,适用于DeepFaceLive的DFM合集

50直播模型:点击下载 作为直播达人,我在网上购买了大量直播用的模型资源,包含男模女模、明星脸、大众脸、网红脸及各种稀缺的路人素人模型。现在,我将这些宝贵的资源整理成合集分享给大家,需要的朋友们可以直接点击下…