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

在这里插入图片描述

文章目录

  • 5.1 Maven 和 Gradle - 构建你的堡垒
    • 5.1.1 基础知识
    • 5.1.2 重点案例:使用 Maven 构建一个简单的 Java 应用
    • 5.1.3 拓展案例 1:使用 Gradle 构建一个 Spring Boot 应用
    • 5.1.4 拓展案例 2:使用 Maven 管理多模块项目
  • 5.2 Spring 框架 - 你的魔法棒
    • 5.2.1 基础知识
    • 5.2.2 重点案例:创建一个简单的 Spring Boot Web 应用
    • 5.2.3 拓展案例 1:访问数据库
    • 5.2.4 拓展案例 2:添加安全性
  • 5.3 JUnit 测试 - 保卫你的堡垒
    • 5.3.1 基础知识
    • 5.3.2 重点案例:测试一个简单的计算器类
    • 5.3.3 拓展案例 1:使用 Mock 对象测试
    • 5.3.4 拓展案例 2:参数化测试

5.1 Maven 和 Gradle - 构建你的堡垒

在 Java 的世界里,Maven 和 Gradle 就像是构建和维护你的代码堡垒的得力助手。它们管理依赖、编译代码、运行测试和打包应用,确保你的开发过程既高效又无痛。

5.1.1 基础知识

  • Maven:Maven 使用基于 XML 的 pom.xml 文件来管理项目的构建、报告和文档。它遵循"约定优于配置"的原则,意味着如果你遵循它的默认配置,就几乎不需要做额外的配置工作。

  • Gradle:Gradle 是一个基于 Groovy 的构建工具,使用 build.gradle 文件来编写构建脚本。它结合了 Maven 的约定优于配置的原则和 Ant 的灵活性,同时引入了基于 Groovy 的 DSL(领域特定语言),使得构建脚本更加简洁和强大。

5.1.2 重点案例:使用 Maven 构建一个简单的 Java 应用

假设我们要创建一个简单的 Java 应用,这个应用依赖于 Google Guava 库。

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-application</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1-jre</version></dependency></dependencies>
</project>

这个 pom.xml 文件定义了一个项目和一个依赖。Maven 会自动下载和管理这个依赖,让你可以轻松使用 Guava 库的功能。

5.1.3 拓展案例 1:使用 Gradle 构建一个 Spring Boot 应用

Spring Boot 应用的构建和部署可以通过 Gradle 来简化。假设我们要创建一个简单的 Spring Boot Web 应用。

build.gradle:

plugins {id 'org.springframework.boot' version '2.4.1'id 'java'
}group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'repositories {mavenCentral()
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'
}test {useJUnitPlatform()
}

这个 build.gradle 文件使用了 Spring Boot Gradle 插件来简化 Spring 应用的构建和打包过程。

5.1.4 拓展案例 2:使用 Maven 管理多模块项目

在大型项目中,你可能需要将你的项目分解成多个模块,每个模块负责不同的任务。Maven 支持多模块项目的构建,让你可以在一个父项目中管理多个子项目。

父项目的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0</version><packaging>pom</packaging><modules><module>module1</module><module>module2</module></modules>
</project>

每个子模块都会有自己的 pom.xml 文件,但它们都是父项目的一部分,可以共享依赖和插件配置。

通过这些案例,我们可以看到 Maven 和 Gradle 如何成为 Java 开发中不可或缺的工具,帮助你高效地管理项目依赖、构建和打包应用。无论是简单的单一应用还是复杂的多模块项目,它们都能让你的开发过程更加顺畅。现在,穿上你的斗篷,开始你的构建之旅吧!

在这里插入图片描述


5.2 Spring 框架 - 你的魔法棒

Spring框架,就像是赋予了Java开发者超能力的魔法棒,让复杂的企业级应用开发变得简单而优雅。它提供了一套全面的编程和配置模型,支持现代Java应用的全方位开发需求。

5.2.1 基础知识

  • IoC 容器(Inversion of Control):Spring的核心是其IoC容器,它管理应用中对象的创建、配置和管理。通过依赖注入(DI),对象之间的依赖关系在运行时自动解决,减少了代码耦合。

  • AOP(面向切面编程):Spring支持AOP,允许开发者定义横切关注点(如日志、事务管理),从而提高模块化。

  • Spring MVC:一个用于构建Web应用的强大框架,基于Model-ViewController(模型-视图-控制器)架构。

  • Spring Boot:简化了基于Spring的应用开发,提供了大量自动配置,使得项目启动和配置更加容易。

5.2.2 重点案例:创建一个简单的 Spring Boot Web 应用

假设我们要创建一个简单的Web应用,用于返回“Hello, World!”消息。

Spring Boot 应用主类:

@SpringBootApplication
public class HelloWorldApplication {public static void main(String[] args) {SpringApplication.run(HelloWorldApplication.class, args);}@RestControllerpublic static class HelloWorldController {@GetMapping("/")public String hello() {return "Hello, World!";}}
}

在这个例子中,@SpringBootApplication启动了Spring的自动配置和Spring应用上下文。HelloWorldController是一个简单的REST控制器,通过@RestController@GetMapping注解定义,当访问根URL时,返回“Hello, World!”。

5.2.3 拓展案例 1:访问数据库

使用Spring Data JPA简化数据库操作,自动实现数据访问层。

@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;private String name;// Getters and setters omitted for brevity
}@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserRepository userRepository;@GetMappingpublic List<User> listUsers() {return userRepository.findAll();}
}

在这个例子中,User类通过@Entity注解映射到数据库表。UserRepository接口继承JpaRepository,提供了丰富的数据访问方法。UserController通过注入UserRepository来访问用户数据,并通过REST API暴露出来。

5.2.4 拓展案例 2:添加安全性

使用Spring Security添加基本的认证和授权。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();}
}

在这个例子中,WebSecurityConfig类通过@EnableWebSecurity注解启用了Web安全性,并通过重写configure方法配置了HTTP请求的安全性。所有的请求都需要认证,支持表单登录和HTTP基本认证。

通过这些案例,我们可以看到Spring框架和Spring Boot如何让企业级应用的开发变得更加简单和高效。从创建RESTful服务、操作数据库到加强安全性,Spring都提供了强大的支持。掌握Spring,让你的Java开发之旅充满魔法和可能!

在这里插入图片描述


5.3 JUnit 测试 - 保卫你的堡垒

在软件开发的世界中,写代码就像是建造一座堡垒,而JUnit测试则是那些守卫堡垒的勇士,确保每一块石头都牢固可靠。JUnit是Java开发中最流行的单元测试框架之一,它提供了一套简单的注解和断言来帮助开发者编写和执行测试,从而确保代码的质量和稳定性。

5.3.1 基础知识

  • 基本注解

    • @Test:标记一个方法为测试方法。
    • @Before/@BeforeEach:在每个测试方法执行前运行。
    • @After/@AfterEach:在每个测试方法执行后运行。
    • @BeforeClass/@BeforeAll:在所有测试开始前只运行一次。
    • @AfterClass/@AfterAll:在所有测试结束后只运行一次。
  • 断言:JUnit提供了一系列的断言方法来检查测试结果是否符合预期,如assertEquals(), assertTrue(), assertNotNull()等。

5.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.Assert.*;
import org.junit.Test;public class CalculatorTest {private Calculator calculator = new Calculator();@Testpublic void testAdd() {assertEquals(5, calculator.add(2, 3));}@Testpublic void testSubtract() {assertEquals(1, calculator.subtract(3, 2));}
}

在这个案例中,我们为Calculator类的addsubtract方法编写了单元测试,使用assertEquals断言来验证方法的返回值是否符合预期。

5.3.3 拓展案例 1:使用 Mock 对象测试

在复杂的应用中,某些类的测试可能依赖于其他组件。为了隔离测试,我们可以使用Mock对象来模拟这些依赖。

假设我们有一个UserService类,它依赖于UserRepository。我们可以使用Mockito来模拟UserRepository

UserServiceTest.java:

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.junit.runner.RunWith;@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {@Mockprivate UserRepository userRepository;@InjectMocksprivate UserService userService;@Testpublic void testFindUserById() {when(userRepository.findUserById(1)).thenReturn(new User(1, "Alice"));User user = userService.findUserById(1);assertEquals("Alice", user.getName());}
}

5.3.4 拓展案例 2:参数化测试

当我们需要对同一方法使用不同的输入值进行多次测试时,可以使用JUnit的参数化测试功能。

StringHelperTest.java:

import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.Test;
import static org.junit.Assert.*;@RunWith(Parameterized.class)
public class StringHelperTest {private String input;private String expectedOutput;public StringHelperTest(String input, String expectedOutput) {this.input = input;this.expectedOutput = expectedOutput;}@Parameterized.Parameterspublic static Collection<Object[]> testConditions() {return Arrays.asList(new Object[][] {{"AACD", "CD"},{"ACD", "CD"}});}@Testpublic void testRemoveAInFirst2Positions() {assertEquals(expectedOutput, StringHelper.removeAInFirst2Positions(input));}
}

通过这些案例,我们看到JUnit测试如何成为Java开发者守卫代码质量的强大工具。它不仅可以帮助我们确保代码的正确性,还能使重构和维护变得更加容易。记得经常运行你的测试勇士们,让你的代码堡垒坚不可摧!

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

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

相关文章

【数据分享】2000~2018年青藏高原0.05°逐日积雪深度数据集

各位同学们好&#xff0c;今天和大伙儿分享的是2000~2018年青藏高原0.05逐日积雪深度数据集。如果大家有下载处理数据等方面的问题&#xff0c;可以添加我的微信交流~ 闫大江, 马宁, 张寅生. (2021). 青藏高原0.05逐日积雪深度数据集&#xff08;2000-2018&#xff09;. 国家青…

Java并发基础:PriorityBlockingQueue全面解析!

内容概要 PriorityBlockingQueue类能高效处理优先级任务&#xff0c;确保高优先级任务优先执行&#xff0c;它内部基于优先级堆实现&#xff0c;保证了元素的有序性&#xff0c;同时&#xff0c;作为BlockingQueue接口的实现&#xff0c;它提供了线程安全的队列操作&#xff0…

[缓存] 1. 缓存共性问题

1. 缓存的作用 为什么需要缓存呢&#xff1f;缓存主要解决两个问题&#xff0c;一个是提高应用程序的性能&#xff0c;降低请求响应的延时&#xff1b;一个是提高应用程序的并发性。 2. 缓存的分类 本地缓存&#xff0c;分布式缓存 3. 缓存数据分类 3.1 数据缓存 程序数据直接…

Linux_环境变量_命令行参数

一.环境变量 在Linux中自己写的程序必须要带路径才能运行&#xff0c;相对路径或是绝对路径&#xff0c;但是像ls pwd这样的程序&#xff0c;不带路径也能运行。当你想要运行一个程序时&#xff1a; 如果带有路径的话&#xff0c;则直接将对应路径的程序加载进内存&#xff0…

七天入门大模型 :提示词工程 Prompt Engineering,最全的总结来了!

文章目录 技术交流群用通俗易懂方式讲解系列引 言LLM 的超参配置Prompt Engineering指令主要内容少样本学习更加明确的提示善用分隔符思维链提示对输出格式的明确要求 最佳实践案例1. Agent场景&#xff1a;使用prompt实现agent create2. Agent场景&#xff1a;使用system mess…

腾讯云4核8G服务器3年600元?

腾讯云4核8G服务器3年600元&#xff1f;目前的价格是轻量应用服务器4核8G12M带宽一年446元、646元15个月&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;在txy.wiki可以查询详细…

thinkphp5.0提示不支持redis,not support: redis

安装PHP扩展 例如宝塔&#xff0c;其他环境请用命令行&#xff0c;安装 redis配置完成以后&#xff0c;修改php.ini把redis扩展打开即可&#xff0c;重启环境

英伟达市值超越谷歌!老黄隔空回应Altman的巨资筹款计划:没必要,真的没必要!

凭借算力上的霸主地位&#xff0c;英伟达正稳步成为科技领域的下一个巨头&#xff0c;在不久的15个月前&#xff0c;英伟达的市值还不足3000亿美元。然而&#xff0c;截至昨日&#xff0c;英伟达股价飙升使其市值达到了1.83万亿美元&#xff0c;超越了Alphabet&#xff08;谷歌…

解锁未来:探秘Zxing二维码技术的神奇世界

解锁未来&#xff1a;探秘Zxing二维码技术的神奇世界 1. 引言 在当今数字化和智能化的社会中&#xff0c;二维码技术已经成为人们生活中不可或缺的一部分。从商品购物、支付结算到健康码、门票核销&#xff0c;二维码无处不在&#xff0c;极大地方便了人们的生活和工作。而Zx…

Peter算法小课堂—区间模型(2)

上次咋们讲了前两个区间模型&#xff1a;1.最大不重叠区间数 2.不重叠区间最少分组数。今天我们就学习&#xff1a;最小区间覆盖问题、区间重叠最厚层数&#xff01; 最小区间覆盖 先看三道题 那么&#xff0c;第1题&#xff0c;它是浮点数的题&#xff0c;也就要求首尾相同。…

JavaScript 事件循环:Event Loop

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 事件循环 是 web 开发中的一个核心概念&#xff0c;它是 JavaScript…

【Azure】微软 Azure 基础解析(五)核心体系结构之管理组、订阅、资源和资源组以及层次关系

本系列博文还在更新中&#xff0c;收录在专栏&#xff1a;「Azure探秘&#xff1a;构建云计算世界」 专栏中。 本系列文章列表如下&#xff1a; 【Azure】微软 Azure 基础解析&#xff08;三&#xff09;描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx…