《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@GeneratedValueprivate 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 {@Overrideprotected 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();@Testvoid testAdd() {assertEquals(5, calculator.add(2, 3), "2 + 3 should equal 5");}@Testvoid 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 {@Mockprivate Logger logger;@Testvoid testAdd() {Calculator calculator = new Calculator(logger);calculator.add(2, 3);verify(logger).log("Adding 2 + 3");}
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

Vue-自定义属性和插槽(五)

目录 自定义指令 基本语法 (全局&局部注册) 指令的值 练习&#xff1a;v-loading 指令封装 总结&#xff1a; 插槽&#xff08;slot&#xff09; 默认插槽 插槽 - 后备内容&#xff08;默认值&#xff09; 具名插槽 具名插槽基本语法: 具名插槽简化语法: 作…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之StepperItem组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之StepperItem组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、StepperItem组件 用作Stepper组件的页面子组件。 子组件 无。 接口 St…

浅谈进制的转换

本文创作灵感来自CSDN咸鱼WCY 的 咸鱼小白学嵌入式之C语言&#xff08;2.进制&#xff09; 博主更完就没更了&#xff0c;决定书接上回&#xff08;喜 进制是个啥 要理解进制&#xff0c;首先哈&#xff0c;咱得知道不同进制的含义 说到底&#xff0c;各个进制其实有点像在…

双活工作关于nacos注册中心的数据迁移

最近在做一个双活的项目&#xff0c;在纠结一个注册中心是在双活机房都准备一个&#xff0c;那主机房的数据如果传过去呢&#xff0c;查了一些资料&#xff0c;最终在官网查到了一个NacosSync 的组件&#xff0c;主要用来做数据传输的&#xff0c;并且支持在线替换注册中心的&a…

java SSM新闻管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM新闻管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

springsecurity6使用

spring security 中的类 &#xff1a; AuthenticationManager : 实现类&#xff1a;ProviderManager 管理很多的 provider &#xff0c;&#xff0c;&#xff0c; 经常使用的&#xff0c;DaoAuthenticationProvider , 这个要设置一个 UserDetailService , 查找数据库&#xff…

生存类游戏《幻兽帕鲁》从部署服务器到开始体验全过程

SteamDB数据显示&#xff0c;《幻兽帕鲁》上线24小时内&#xff0c;在线人数峰值便突破200万&#xff0c;跻身Steam历史排行榜第二位。随着热度进一步发酵&#xff0c;《幻兽帕鲁》官方发布推文称&#xff0c;游戏发售不到6天&#xff0c;销量已经突破了 800万份。欢迎大家在阿…

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

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

消息中间件面试篇

目录 消息中间件 RabbitMQ 消息不丢失 生产者确认机制 消息持久化 交换机持久化 队列持久化 消息持久化 消费者确认 消息重复消费 出现的场景 解决方案 每条消息设置一个唯一的标识id 幂等方案&#xff1a;【 分布式锁、数据库锁&#xff08;悲观锁、乐观锁&#…

【教学类-48-04】202402013“天干地支 六十一甲子”.

背景需求&#xff1a; 2024年是甲辰龙年。 “辛亥革命”“甲午海战”"戊戌变法”都有天干地支的身影。 参观历史建筑&#xff0c;不少书法碑刻上都是用天干地支进行年代记名 所以我用Python来制作60一甲子的所有天干地支组合 60一甲子 天干地支的排序 作者&#xff1a;阿…

JavaScript中有哪些不同的数据类型

在 JavaScript 中&#xff0c;数据类型是一种用来表示数据的分类&#xff0c;它决定了我们可以对这个数据类型执行哪些操作。在 JavaScript 中有以下几种不同的数据类型&#xff1a; 基本数据类型 字符串 (String)&#xff1a;表示一组字符&#xff0c;可以使用引号&#xff08…

理解JAVA EE设计模式

理解JAVA EE设计模式 在Web应用程序的设计和开发阶段,开发人员在开发类似的项目时可能会遇到相似的问题。每名开发人员可能会遇到的问题找出不同或相似的解决方案。但是,这导致一些时间和精力浪费在为相似的问题寻找解决方案上。因此,要啊节省时间和精力,需要记录常见问题…

VMware清理拖拽缓存 Ubuntu硬盘情况占用分析

这两天在尝试编译Linux源码&#xff0c;我在win上将源码下载下来然后复制到ubuntu上&#xff0c;这一步我粗略看到了三种方法&#xff1a;安装VM tools&#xff0c;就可以使文件正常的在win和ubuntu中复制剪切&#xff1b;使用scp命令将win和linux系统链接起来&#xff1b;使用…

柚见(伙伴匹配系统)第三期

后端整合SwaggerKnife4j 什么是接口文档 什么是接口文档&#xff1f; 写接口信息的文档&#xff0c; 每条接口包括&#xff1a; 请求参数响应参数错误码接口地址接口名称请求类型请求格式备注 who 谁用&#xff1f; 一般是后端或者负责人来提供&#xff0c;后端和前端都要使用…

Android---PermissionX实现动态权限申请

Google 在 Android 6.0 开始引入了权限申请机制&#xff0c;将所有权限分成了正常权限和危险权限。App 每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。 PermissionX是一个扩展Android库&#xff0c;使Android运行时权限请求变得极其容易。你可以将它用于基本的…

ONLYOFFICE文档8.0新功能浅探

ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天&#xff0c;ONLYOFFICE版本更新了&#xff01;更新到了一个比较整的大的版本号&#xff0c;8.0版本&#xff0c;看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度&#xff0c;还是很快的&#xff0c;一般来…

JavaScript 的点击劫持(Clickjacking)

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 点击劫持是一种恶意攻击&#xff0c;攻击者会在用户不知情的情况下诱…

在面试中如何回复擅长vue还是react

当面试官问及这个问题的时候&#xff0c;我们需要思考面试官是否是在乎你是掌握vue还是react吗&#xff1f;&#xff1f;&#xff1f; 在大前端的一个环境下&#xff0c;当前又有AI人工智能的加持辅助&#xff0c;我们是不是要去思考企业在进行前端岗位人员需求的时候&#xf…

【JavaEE】_传输层协议UDP与TCP

目录 1. 开发中常见的数据组织格式 1.1 XML 1.2 JSON 1.3 Protobuf 2. 端口号 3. UDP协议 4. TCP协议 4.1 特点 4.2 TCP报文格式 4.3 TCP可靠性机制 4.3.1 确认应答机制 4.3.2 超时重传机制 4.3.2.1 丢包的两种情况 4.3.2.2 重传时间 4.3.3 连接管理机制 4.3.3…