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

news2025/1/20 4:42:27

在这里插入图片描述

文章目录

  • 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代码更加健壮、可靠。记住,一个好的魔法师不仅仅会施法,还会确保每次施法都是安全可控的。

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

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

相关文章

【JavaEE Spring】Spring 原理

Spring 原理 1. Bean的作⽤域1.1 概念1.2 Bean的作⽤域 2. Bean的⽣命周期 1. Bean的作⽤域 1.1 概念 在Spring IoC&DI阶段, 我们学习了Spring是如何帮助我们管理对象的. 通过 Controller , Service , Repository , Component , Configuration ,Bean 来声明Bean对象。通…

数学建模:K-means聚类手肘法确定k值(含python实现)

原理 当K-means聚类的k值不被指定时&#xff0c;可以通过手肘法来估计聚类数量。   在聚类的过程中&#xff0c;随着聚类数的增大&#xff0c;样本划分会变得更加精细&#xff0c;每个类别的聚合程度更高&#xff0c;那么误差平方和&#xff08;SSE&#xff09;会逐渐变小&am…

备战蓝桥杯---图论基础理论

图的存储&#xff1a; 1.邻接矩阵&#xff1a; 我们用map[i][j]表示i--->j的边权 2.用vector数组&#xff08;在搜索专题的游戏一题中应用过&#xff09; 3.用邻接表&#xff1a; 下面是用链表实现的基本功能的代码&#xff1a; #include<bits/stdc.h> using nam…

那些 C语言指针 你不知道的小秘密 (完结篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能…

蓝桥杯嵌入式第11届真题(完成) STM32G431

蓝桥杯嵌入式第11届真题(完成) STM32G431 题目 代码 程序和之前的大同小异&#xff0c;不过多解释 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief :…

第4讲 小程序首页实现

首页 create.vue <template><view class"vote_type"><view class"vote_tip_wrap"><text class"type_tip">请选择投票类型</text><!-- <text class"share">&#xe739;分享给朋友</text&g…

免费分享一套PyQt6学生信息管理系统 Python管理系统 Python源码,挺漂亮的

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的PyQt6学生信息管理系统 Python管理系统 Python源码&#xff0c;分享下哈。 项目视频演示 【免费】PyQt5 学生信息管理系统 Python管理系统 Python源码 Python毕业设计_哔哩哔哩_bilibili【免费】PyQt5 学生…

康熙字典的部首里为啥没有王字旁

很多汉字的偏旁部首&#xff0c;是“王”&#xff0c;但在康熙字典的部首列表里&#xff0c;却没有它。而新华字典是有的。 这不科学啊&#xff0c;于是我还通过Unicode编码查了下康熙部首的编码部分&#xff0c;确认了一下&#xff0c;发面里面确实没有。 康熙部首&#xff08…

顺序表、链表(ArrayList、LinkedList)

目录 前言&#xff1a; 顺序表&#xff08;ArrayList&#xff09;&#xff1a; 顺序表的原理&#xff1a; ArrayList源码&#xff1a; 的含义&#xff1a;​编辑 ArrayList的相关方法&#xff1a;​编辑 向上转型List&#xff1a; 练习题&#xff08;杨辉三角&#x…

单页404源码

<!doctype html> <html> <head> <meta charset"utf-8"> <title>简约 404错误页</title><link rel"shortcut icon" href"./favicon.png"><style> import url("https://fonts.googleapis.co…

Java中抽象类和接口的区别

抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别(重要!!! 常见面试题)。 核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写而重写抽象方法), 而接口中不能包含普通方法&#xff08;接口…

生成式人工智能(AIGC)之最全详解图解

生成式人工智能&#xff08;AIGC&#xff09;之最全详解图解 1. AIGC的发展历程1.1 AIGC演化重要时间节点AIGC发展历程图OpenAI大语言模型发展进程 1.2技术推进路线 2.AIGC技术场景2.1 技术场景 3.1AIGC相关应用4.AIGC未来发展前景 1. AIGC的发展历程 AIGC&#xff08;AI-Gene…

ClickHouse--04--数据库引擎、Log 系列表引擎、 Special 系列表引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.数据库引擎1.1 Ordinary 默认数据库引擎1.2 MySQL 数据库引擎MySQL 引擎语法字段类型的映射 2.ClickHouse 表引擎3.Log 系列表引擎几种 Log 表引擎的共性是&#…

任务调度

1.学习目标 1.1 定时任务概述 1.2 jdk实现任务调度 1.3 SpringTask实现任务调度 1.4 Spring-Task 分析 1.5 Cron表达式 https://cron.qqe2.com/ 2. Quartz 基本应用 2.1 Quartz 基本介绍 2.2 Quartz API介绍 2.3 入门案例 <dependency> <groupId>org.springframe…

《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)

文章目录 7.1 网络基础和 Java 中的网络 - 揭开神秘的面纱7.1.1 基础知识7.1.2 重点案例&#xff1a;实现一个简单的聊天程序7.1.3 拓展案例 1&#xff1a;使用 UDP 进行消息广播7.1.4 拓展案例 2&#xff1a;建立一个简单的 Web 服务器 7.2 创建客户端和服务器 - 构建沟通的桥…

Microsoft Word 清除格式

Microsoft Word 清除格式 References 选择文本&#xff0c;用快捷键 Ctrl Shift N&#xff0c;可以快速清除格式。 选择文本&#xff0c;清除格式。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Java图形化界面编程—— ImageIO 笔记

2.8.4 ImageIO的使用 在实际生活中&#xff0c;很多软件都支持打开本地磁盘已经存在的图片&#xff0c;然后进行编辑&#xff0c;编辑完毕后&#xff0c;再重新保存到本地磁盘。如果使用AWT要完成这样的功能&#xff0c;那么需要使用到ImageIO这个类&#xff0c;可以操作本地磁…

【数据结构】二叉树先序、中序、后序及层次四种遍历(C语言版)

数据结构——二叉树先序、中序、后序三种遍历 一、图示展示&#xff1a; &#xff08;1&#xff09;先序遍历&#xff08;2&#xff09;中序遍历&#xff08;3&#xff09;后序遍历&#xff08;4&#xff09;层次遍历&#xff08;5&#xff09;口诀 二、代码展示&#xff1a; 一…

使用JNDI API

使用JNDI API Java EE应用程序使用JNDI API作为通用的名称查找服务来查找组件、外部资源和组件环境属性。JNDI API公开底层命名协议和实现的详细信息。 1. JNDI API的架构 JNDI架构由以下组件组成: JNDI API:它可让Java应用程序访问各种命名服务和目录服务。JNDI服务提供商接…

‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

遇到 vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 的错误时&#xff0c;通常意味着Vue CLI没有被正确安装或配置在项目中。这可能是因为node_modules目录缺失了必要的包&#xff0c;或者局部安装的Vue CLI没有被正确设置到系统的PATH环境…