《Java 简易速速上手小册》第9章:Java 开发工具和框架 (2024 最新版)

在这里插入图片描述

文章目录

  • 9.1 Maven 和 Gradle - 构建与依赖管理的神兵利器
    • 9.1.1 基础知识
    • 9.1.2 重点案例:使用 Maven 构建 Spring Boot 应用
    • 9.1.3 拓展案例 1:使用 Gradle 构建多模块项目
    • 9.1.4 拓展案例 2:利用 Gradle Wrapper 确保构建的一致性
  • 9.2 Spring 框架概述 - Java 世界的魔法园林
    • 9.2.1 基础知识
    • 9.2.2 重点案例:构建 RESTful Web 服务
    • 9.2.3 拓展案例 1:使用 Spring Data JPA 操作数据库
    • 9.2.4 拓展案例 2:利用 Spring Security 增强应用安全
  • 9.3 JUnit 测试 - 保证你的魔法不会走火
    • 9.3.1 基础知识
    • 9.3.2 重点案例:测试一个简单的计算器类
    • 9.3.3 拓展案例 1:使用参数化测试
    • 9.3.4 拓展案例 2:模拟外部依赖

9.1 Maven 和 Gradle - 构建与依赖管理的神兵利器

在Java的世界里,Maven和Gradle是两位强大的法师,专门负责管理构建和依赖,确保开发者能够专注于编码而不是琐碎的构建细节。

9.1.1 基础知识

  • Maven:通过pom.xml文件管理项目的生命周期、依赖、插件等。它遵循“约定优于配置”的原则,简化了项目构建过程。
  • Gradle:基于Groovy的DSL(领域特定语言)进行项目配置,提供了更高的灵活性和强大的性能。它允许开发者编写更简洁的构建脚本。

9.1.2 重点案例:使用 Maven 构建 Spring Boot 应用

让我们开始一个新的探险,使用Maven来构建一个简单的Spring Boot应用。

步骤:

  1. 创建pom.xml文件,并添加Spring Boot起步依赖。
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.adventure</groupId>
    <artifactId>spring-boot-quest</artifactId>
    <version>1.0.0</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
  1. 创建主类AdventureApplication.java,并运行Spring Boot应用。
package com.adventure;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AdventureApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdventureApplication.class, args);
    }
}

9.1.3 拓展案例 1:使用 Gradle 构建多模块项目

在一个更大的探险中,你可能需要将你的项目分成多个模块。Gradle提供了强大的多项目构建支持。

根项目的build.gradle:

allprojects {
    group 'com.adventure'
    version '1.0.0'
}

subprojects {
    apply plugin: 'java'
}

project(':library') {
    dependencies {
        // 依赖配置
    }
}

project(':application') {
    dependencies {
        implementation project(':library')
    }
}

设置模块:

在根项目的settings.gradle文件中声明模块。

rootProject.name = 'multi-module-adventure'
include 'application', 'library'

9.1.4 拓展案例 2:利用 Gradle Wrapper 确保构建的一致性

Gradle Wrapper是一个脚本和库的集合,它允许你不需要预先安装Gradle就能构建你的项目。这保证了每个开发者和CI/CD环境使用相同版本的Gradle,避免了“在我的机器上可以运行”的问题。

生成Gradle Wrapper:

在项目根目录执行以下命令:

gradle wrapper --gradle-version 6.3

这会生成gradlewgradlew.bat脚本以及gradle/wrapper目录,你可以将这些文件加入版本控制。

使用Gradle Wrapper构建项目:

./gradlew build

通过这些案例,你已经学会了如何使用Maven和Gradle这两位强大的法师来管理你的Java项目。它们不仅可以帮助你轻松地构建和管理项目,还能确保项目的构建过程简洁高效。现在,带上这些神兵利器,继续你的Java冒险吧!

在这里插入图片描述


9.2 Spring 框架概述 - Java 世界的魔法园林

Spring框架是Java开发中的一片魔法园林,它提供了一系列的魔法(框架特性)来帮助开发者高效地创建企业级应用。从依赖注入、面向切面编程到操作数据和构建Web应用,Spring让这一切变得简单而优雅。

9.2.1 基础知识

  • 依赖注入(DI):Spring的核心特性,允许你通过声明方式而非硬编码方式来管理组件之间的依赖关系,增加了代码的灵活性和可测试性。
  • 面向切面编程(AOP):允许你定义通用的逻辑(如事务管理和安全),并将这些逻辑应用到多个点,减少了代码的重复。
  • Spring MVC:一个强大的构建Web应用的框架,它提供了一种分离控制器、模型对象、和视图的方法,使得Web应用的开发变得更加清晰和简单。
  • Spring Boot:在Spring的基础上进一步简化了配置和部署的流程,让开发者可以快速启动新项目。

9.2.2 重点案例:构建 RESTful Web 服务

我们将使用Spring Boot来构建一个简单的RESTful Web服务,展示如何快速开发和部署一个Spring应用。

步骤:

  1. 创建一个新的Spring Boot项目。
  2. 添加spring-boot-starter-web依赖。
  3. 创建一个新的RestController来处理HTTP请求。

示例代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class MagicGardenApplication {

    public static void main(String[] args) {
        SpringApplication.run(MagicGardenApplication.class, args);
    }

    @GetMapping("/hello")
    public String sayHello() {
        return "Welcome to the Magic Garden of Spring!";
    }
}

9.2.3 拓展案例 1:使用 Spring Data JPA 操作数据库

Spring Data JPA让操作数据库变得轻松愉快,我们将通过一个简单的例子来展示如何使用Spring Data JPA来持久化数据到数据库。

步骤:

  1. 添加spring-boot-starter-data-jpa和数据库驱动的依赖。
  2. 创建一个实体类和一个Repository接口。
  3. 使用Repository接口进行数据操作。

示例代码:

import org.springframework.data.jpa.repository.JpaRepository;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Adventure {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    // Getters and setters omitted for brevity
}

public interface AdventureRepository extends JpaRepository<Adventure, Long> {
}

9.2.4 拓展案例 2:利用 Spring Security 增强应用安全

Spring Security提供了一系列强大的安全特性,帮助你保护你的应用免受常见安全威胁。我们将展示如何添加基本的HTTP认证。

步骤:

  1. 添加spring-boot-starter-security依赖。
  2. 创建一个WebSecurityConfigurerAdapter的实现,来配置安全策略。

示例代码:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests().anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}

通过以上案例,你已经学会了如何使用 Spring 框架来快速开发一个 RESTful Web 服务,如何使用 Spring Data JPA 操作数据库,以及如何利用 Spring Security 增强应用的安全性。Spring 框架的魔法园林中藏着无尽的可能,探索它们将使你的 Java 开发之旅充满乐趣和惊喜。

在这里插入图片描述


9.3 JUnit 测试 - 保证你的魔法不会走火

在Java世界的冒险中,编写魔法(代码)是一件充满乐趣的事情,但要确保每次施法都能精准有效,就需要一位可靠的法术校验师——这就是JUnit测试的角色。通过JUnit测试,我们可以确保我们的魔法(代码逻辑)正如我们所期望的那样工作,避免在实际使用中出现意外。

9.3.1 基础知识

  • JUnit 5:是当前最新的Java测试框架版本,提供了更加强大和灵活的测试特性,包括但不限于显示名称的测试、动态测试、参数化测试以及更多的生命周期回调。
  • 断言:JUnit提供了一系列的断言方法,用于验证测试结果是否符合预期,是测试中最常用的工具之一。
  • 测试注解:JUnit 5引入了一系列新的注解来支持更复杂的测试场景,如@BeforeEach@AfterEach@BeforeAll@AfterAll@Test等。

9.3.2 重点案例:测试一个简单的计算器类

假设我们有一个简单的计算器类,提供了加法和减法功能,我们将编写测试用例来验证这些功能。

Calculator.java:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }
}

CalculatorTest.java:

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class CalculatorTest {
    private final Calculator calculator = new Calculator();

    @Test
    void testAdd() {
        assertEquals(5, calculator.add(2, 3), "2 + 3 should equal 5");
    }

    @Test
    void testSubtract() {
        assertEquals(1, calculator.subtract(3, 2), "3 - 2 should equal 1");
    }
}

9.3.3 拓展案例 1:使用参数化测试

当我们需要对同一方法使用不同的参数进行测试时,参数化测试可以大大简化测试代码。

ParameterizedCalculatorTest.java:

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

public class ParameterizedCalculatorTest {
    private final Calculator calculator = new Calculator();

    @ParameterizedTest
    @CsvSource({"2, 3, 5", "3, 5, 8", "-1, -2, -3"})
    void testAdd(int a, int b, int expectedResult) {
        assertEquals(expectedResult, calculator.add(a, b),
            () -> a + " + " + b + " should equal " + expectedResult);
    }
}

9.3.4 拓展案例 2:模拟外部依赖

在测试时,经常需要模拟外部依赖,以确保测试的独立性。我们可以使用Mockito框架来模拟这些依赖。

假设我们的计算器现在需要记录每次计算的结果,我们将模拟这个记录器。

CalculatorWithLoggerTest.java:

import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(MockitoExtension.class)
public class CalculatorWithLoggerTest {
    @Mock
    private Logger logger;

    @Test
    void testAdd() {
        Calculator calculator = new Calculator(logger);
        calculator.add(2, 3);
        verify(logger).log("Adding 2 + 3");
    }
}

通过这些案例,你已经学会了如何使用JUnit进行基本测试、参数化测试以及如何在测试中模拟外部依赖。这些技巧将帮助你确保你的Java代码更加健壮、可靠。记住,一个好的魔法师不仅仅会施法,还会确保每次施法都是安全可控的。

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

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

相关文章

【数据结构】哈希表的开散列和闭散列模拟

哈希思想 在顺序和树状结构中&#xff0c;元素的存储与其存储位置之间是没有对应关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过多次的比较。 顺序查找的时间复杂度为0(N)&#xff0c;树的查找时间复杂度为log(N)。 我们最希望的搜索方式&#xff1a;通过元素的…

计算x的平方根x含负数和复数cmath.sqrt(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算x的平方根 x含负数和复数 cmath.sqrt(x) cmath.sqrt(-4)输出的结果是&#xff1f; import cmath import math a 4 print("【显示】a ",a) print("【执行】math.sqrt(a)&…

InstantBox:开箱即用的临时 Linux 环境

在云计算和虚拟化技术日益成熟的今天&#xff0c;我们有时需要一个快速、简单、临时的 Linux 环境来进行各种任务。这就是 InstantBox 的用武之地。 什么是 InstantBox&#xff1f; InstantBox 是一个开源项目&#xff0c;它可以快速启动临时的 Linux 系统&#xff0c;并提供…

HeidiSQL安装配置(基于小皮面板(phpstudy))连接MySQL

下载资源 对于这款图形化工具&#xff0c;博主建议通过小皮面板&#xff08;phpstudy&#xff09;来下载即可&#xff0c;也是防止你下载到钓鱼软件&#xff0c;小皮面板&#xff08;phpstudy&#xff09;如果你不懂是什么&#xff0c;请看下面链接这篇博客 第二篇&#xff1a;…

Vision Transformer Pytorch 实现代码学习记录

目前运营的社交平台账号&#xff1a; CSDN 【雪天鱼】: 雪天鱼-CSDN博客哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.com 可能后续有更新&#xff0c;也可能没有更新&#xff0c;谨慎参考 V1.0 24-02-13 ViT 代码的基本训练, 预测推理脚本运行 1 学习目标 能用官方的 ViT…

React18原理: 核心包结构与两大工作循环

React核心包结构 1 ) react react基础包&#xff0c;只提供定义 react组件(ReactElement)的必要函数一般来说需要和渲染器(react-dom,react-native)一同使用在编写react应用的代码时, 大部分都是调用此包的api比如, 我们定义组件的时候&#xff0c;就是它提供的class Demo ext…

Stream Query Denoising for Vectorized HD Map Construction

参考代码&#xff1a;截止2024.02未开源 动机与出发点 这篇文章是在StreamMapNet的基础上做的&#xff0c;为了在局部地图感知任务上提升时序上的感知稳定性&#xff0c;参考DN-DETR中的去噪方案&#xff0c;为局部地图感知提出一种针对局部地图元素的加噪声方案以及去噪逻辑。…

在线JSON解析格式化工具

在线JSON解析格式化工具 - BTool在线工具软件&#xff0c;为开发者提供方便。JSON在线可视化工具:提供JSON视图,JSON格式化视图,JSON可视化,JSON美化,JSON美化视图,JSON在线美化,JSON结构化,JSON格式化,JSON中文Unicode等等。以清晰美观的结构化视图来展示json,可伸缩折叠展示,…

精品jsp+ssm人事办公管理系统OA考勤考核出入库

《[含文档PPT源码等]精品jspssm基于java的办公管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&…

【Vue】Vue基础入门

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳重求进&#xff0c;晒太阳 Vue概念 是一个用于构建用户界面的渐进式框架优点&#xff1a;大大提高开发效率缺点&#xff1a;需要理解记忆规则 创建Vue实例 步骤&#xff1a; …

微信发送一条消息经历哪些过程。企业微信以及钉钉的IM架构对比

0.前言 微信和钉钉是经常会与到两个IM通讯软件&#xff0c;今天从技术角度对他们两个进行分析。这样也方便对于构建IM系统有更好的了解和认识。如果目标是想构建一个IM即时通信的app或者说想了解一下一条消息的收发会经历什么过程可以详细了解一下。 我们可以想想一下微信发送…

Linux中有名管道和无名管道

无名管道基础 进程间通信介绍 常用通信方式 无名管道&#xff08;pipe&#xff09; 有名管道 &#xff08;fifo&#xff09; 信号&#xff08;signal&#xff09; 共享内存(mmap) 套接字&#xff08;socket&#xff09;过时的IPC通信方式 System V IPC 共享内存&#xff08;sh…

AI大模型开发架构设计(10)——AI大模型架构体系与典型应用场景

文章目录 AI大模型架构体系与典型应用场景1 AI大模型架构体系你了解多少?GPT 助手训练流程GPT 助手训练数据预处理2个训练案例分析 2 AI 大模型的典型应用场景以及应用架构剖析AI 大模型的典型应用场景AI 大模型应用架构 AI大模型架构体系与典型应用场景 1 AI大模型架构体系你…

给你介绍一款适合教培行业的手机软件,很好用,关键还是免费的

给你介绍一款适合教培行业的手机软件&#xff0c;很好用&#xff0c;关键还是免费的&#xff0c;DT浏览器不同于普通意义上的浏览器&#xff0c;DT的含义就是数据资料的意思&#xff0c;更专注于资料的收集和管理&#xff0c;是一款资料管理类的浏览器&#xff0c;也是一款面向…

学生公寓|基于Springboot的学生公寓管理系统设计与实现(源码+数据库+文档)

学生公寓管理系统目录 目录 基于Springboot的学生公寓管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、宿舍列表 2、宿舍公告信息管理 3、宿舍公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

Solidworks:平面工程图练习

把草图变成工程图&#xff0c;遇到第一个问题是线宽需要用鼠标选中后再设置线宽和颜色。我觉得应该有一个自动设置现款的功能&#xff0c;不知道有没有&#xff0c;我找了半天也没找到。 另一个问题是&#xff0c;作业代号字体上下颠倒了&#xff0c;不知道这是啥意思。 第三个…

使用LORA微调RoBERTa

模型微调是指在一个已经训练好的模型的基础上&#xff0c;针对特定任务或者特定数据集进行再次训练以提高性能的过程。微调可以在使其适应特定任务时产生显着的结果。 RoBERTa&#xff08;Robustly optimized BERT approach&#xff09;是由Facebook AI提出的一种基于Transfor…

单片机学习笔记---DS18B20温度传感器

目录 DS18B20介绍 模拟温度传感器的基本结构 数字温度传感器的应用 引脚及应用电路 DS18B20的原理图 DS18B20内部结构框图 暂存器内部 单总线介绍 单总线电路规范 单总线时序结构 初始化 发送一位 发送一个字节 接收一位 接收一个字节 DS18B20操作流程 指令介…

L2-002 链表去重

一、题目 二、解题思路 结构体数组的下标表示该节点的地址&#xff0c;value 表示该节点的值&#xff0c;next 表示下一个结点的地址。result1 表示去重后的链表的节点的地址&#xff0c;result2 表示被删除的链表的节点的地址。 flag 表示节点对应的值是否出现过&#xff0c;…

第二节:轻松玩转书生·浦语大模型趣味Demo

参考教程&#xff1a;https://github.com/InternLM/tutorial/blob/main/helloworld/hello_world.md InternLM-Chat-7B 智能对话 Demo 终端运行 web demo 运行 1.首先启动服务&#xff1a; cd /root/code/InternLM streamlit run web_demo.py --server.address 127.0.0.1 --…