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

    @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 ()方法。

测试结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端笔记】Vue项目报错Error: Cannot find module ‘webpack/lib/RuleSet‘

网上搜了下发现原因不止一种,这里仅记录本人遇到的原因和解决办法,仅供参考 原因:因为某种原因导致本地package.json中vue/cli与全局vue/cli版本不同导致冲突。再次提示,这是本人遇到的,可能和大家有所不同&#xff0c…

【Elasticsearch】Centos7安装Elasticsearch、kibana、IK分词

目录 本文安装包下载地址注意安装elasticsearch1.上传文件2.解压elasticsearch-6.3.1.tar.gz3.开启远程连接权限4.修改其他配置[root用户操作]5.重启虚拟机6.启动es7.外部访问 安装kibana-61.解压2.配置3.启动kibana4.访问5.在开发工具中做数据的增删改查操作 安装IK分词1.wind…

BUUCTF---web---[BJDCTF2020]ZJCTF,不过如此

1、点开连接,页面出现了提示 传入一个参数text,里面的内容要包括I have a dream。 构造:?/textI have a dream。发现页面没有显示。这里推测可能得使用伪协议 在文件包含那一行,我们看到了next.php的提示,我们尝试读取…

cs与msf权限传递,以及mimikatz抓取win2012明文密码

目录 解释参数 foreign http foreign https cs与msf权限传递 Cobalt Strike会话传递到Metasploit Framework Cobalt strike上的操作 ​编辑​编辑​编辑 Metasploit Framework上的操作 传递会话 Metasploit Framework会话传递到Cobalt Strike Cobalt strike上的操作…

rk3568_atomic

文章目录 前言一、atomic是什么?二、原子操作API函数1.atomic原子操作2.原子位操作API三、atomic驱动实验总结前言 本文记录的是正点原子rk3568开发板的atomic实验 一、atomic是什么? 不同的线程在进行读写的过程中,可能会冲突乱入,导致会有预想不到的结果。所以为了让数…

如何进行异地多地兼容组网设置?

跨地区工作、远程办公和异地合作已成为常态。由于网络限制和安全性要求,远程连接仍然是一个具有挑战性的问题。为了解决这一难题,各行各业都在寻找一种能在异地多地兼容的组网设置方案。本文将着重介绍基于【天联】的组网解决方案,探讨其操作…

Unity | 框架MVC

目录 一、MVC介绍 二、搭建UI界面 三、代码实现 1.Model层 2.View层 3.Controller层 四、MVC框架测试 五、知识补充 一、MVC介绍 model:数据层。界面展示的数据(需要进行初始化、更新、保存、事件通知等操作),单例模式&am…

flutter 实现旋转星球

先看效果 planet_widget.dart import dart:math; import package:flutter/material.dart; import package:vector_math/vector_math_64.dart show Vector3; import package:flutter/gestures.dart; import package:flutter/physics.dart;class PlanetWidget extends StatefulW…

内网穿透--Spp-特殊协议-上线

免责声明:本文仅做技术交流与学习... 目录 spp项目: 一图通解: 1-下载spp 2-服务端执行命令 3-客户端执行命令 4-服务端cs监听&生马 spp项目: GitHub - esrrhs/spp: A simple and powerful proxy 支持的协议:tcp、udp、udp、icmp、http、kcp、quic 支持的…

什么是健康信息卡

健康档案信息卡是交由居民本人保管的个人健康信息卡片。 其内容包括:居民个人主要基本信息、健康档案编码、患有的重要疾病、过敏史以及紧急情况下的联系人及联系方式,还有所属基层医疗机构的责任医生、护士及联系电话等。它主要用于居民在复诊、转诊或接…

HTML+CSS 玻璃按钮

效果演示 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>玻璃按钮</title><li…

Distributed Transactions Mit 6.824

Topic1&#xff1a;distributed transactions concurrency control atomic commit 传统计划&#xff1a;事务 程序员标记代码序列的开始/结束作为事务。 事务示例 x 和 y 是银行余额——数据库表中的记录。x 和 y 位于不同的服务器上&#xff08;可能在不同的银行&#x…

【Linux网络】端口及UDP协议

文章目录 1.再看四层2.端口号2.1引入linux端口号和进程pid的区别端口号是如何生成的传输层有了pid还设置端口号端口号划分 2.2问题2.3netstat 3.UDP协议3.0每学一个协议 都要讨论一下问题3.1UDP协议3.2谈udp/tcp实际上是在讨论什么&#xff1f; 1.再看四层 2.端口号 端口号(Po…

Servlet 的 API

HttpServlet init&#xff1a;当 tomcat 收到了 /hello 这样的路径是请求后就会调用 HelloServlet&#xff0c;于是就需要对 HelloServlet 进行实例化&#xff08;只实例一次&#xff0c;后续再有请求也不实例了&#xff09;。 destory&#xff1a;如果是通过 smart tomcat 的停…

存在重复元素 II[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个整数数组nums和一个整数k&#xff0c;判断数组中是否存在两个不同的索引i和j&#xff0c;满足nums[i] nums[j]且abs(i - j) < k。如果存在&#xff0c;返回true&#xff1b;否则&#xff0c;返回false。 示例 1&#…

Netty初识Hello World 事件循环对象(EventLoop) 事件循环组 (EventLoopGroup)

初始Netty-HelloWorld Netty在网络通信中的地位就如同Spring框架在JavaEE开发中的地位。 基于Netty网络通信开发简易的服务端、客户端&#xff0c;以实现客户端向服务端发送hello world&#xff0c;服务端仅接收不返回数据。 服务端代码&#xff1a; Slf4j public class Hell…

ICML2024 定义新隐私保护升级:DP-BITFIT新型微调技术让AI模型学习更安全

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;差分隐私在大模型微调中的重要性和挑战 在当今的深度学习领域&#xff0c;大型预训练模型的微调已成为提高各种任务性能的关键技术。然而&am…

开放式耳机哪个品牌音质好用又实惠耐用?五大公认卷王神器直入!

​在现今耳机市场&#xff0c;开放式耳机凭借其舒适的佩戴体验和独特的不入耳设计&#xff0c;备受消费者追捧。它们不仅让你在享受音乐时&#xff0c;仍能察觉周围的声音&#xff0c;确保与人交流无障碍&#xff0c;而且有利于耳朵的卫生与健康。对于运动爱好者和耳机发烧友而…

AI大模型探索之路-实战篇7:Function Calling技术实战:自动生成函数

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 目录 系列篇章&#x1f4a…

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…