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

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

c431a108708a1289278ce7da1f31c0b.png

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

目录
相关文章
|
22天前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
628 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
4月前
|
自然语言处理 前端开发 Java
JBoltAI 框架完整实操案例 在 Java 生态中快速构建大模型应用全流程实战指南
本案例基于JBoltAI框架,展示如何快速构建Java生态中的大模型应用——智能客服系统。系统面向电商平台,具备自动回答常见问题、意图识别、多轮对话理解及复杂问题转接人工等功能。采用Spring Boot+JBoltAI架构,集成向量数据库与大模型(如文心一言或通义千问)。内容涵盖需求分析、环境搭建、代码实现(知识库管理、核心服务、REST API)、前端界面开发及部署测试全流程,助你高效掌握大模型应用开发。
414 5
|
2月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
165 23
|
1月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
88 12
|
2月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
2月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
129 12
|
4月前
|
SQL 人工智能 Java
阿里云百炼开源面向 Java 开发者的 NL2SQL 智能体框架
Spring-ai-alibaba-nl2sql 是析言 GBI 产品在数据问答领域的一次重要开源尝试,专注于 NL2SQL 场景下的核心能力开放。
1171 48
|
2月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。

热门文章

最新文章