1、简介 Spring Boot Gradle Plugin 在 Gradle 中提供 Spring Boot 支持。它允许我们打包可执行的 JAR 或 war 文件,运行 Spring Boot 应用程序,并使用 spring-boot-dependencies 提供的依赖管理。Spring Boot 3 Gradle Plugin 需要 Gradle 7.x (7.5 或更高版本)或 8.x,并可与 Gradle 的配置缓存一起使用。
在这个教程中,我们将学习关于 Spring Boot 3 Gradle Plugin Task 配置的内容。Spring Boot 3 Gradle Plugin 提供了几个 Gradle task 可用。我们将使用一个简单的 Spring Boot 应用来演示如何配置一些 task。出于演示的目的,我们不会添加任何 security 配置或数据到我们的 Spring Boot 应用中。话不多说,现在让我们深入详细定义和配置这些 task。
2、配置 bootJar Gradle Task 在 Spring Boot 3 Gradle Plugin中,Gradle task 比以前的版本有所改进。一些常见的 Gradle task 包括 bootJar、bootWar、bootRun 和 bootBuildImage。让我们深入了解 bootJar,看看如何配置 bootJar task。
1、概览 在教程中,我们将仔细研究 Spring Boot 中出现的错误:Reason: Canonical names should be kebab-case (’-’ separated), lowercase alpha-numeric characters, and must start with a letter。
首先,我们将阐明 Spring Boot 中出现此错误的主要原因。然后,我们将通过一个实际示例深入探讨如何重现和解决这个问题。
2、问题说明 首先,让我们了解一下错误信息的含义。“Canonical names should be kebab-case” 意思是“规范名称应使用短横线命名法(kebab-case)”。
为确保一致性,@ConfigurationProperties 注解的 prefix 参数中使用的命名约定应遵循短横线命名格式。
例如:
@ConfigurationProperties(prefix = "my-example") 3、Maven 依赖 在 pom.xml 中添加必要的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>3.0.5</version> </dependency> spring-boot-starter 是重现问题的唯一依赖。
4、重现问题 4.1、应用配置 注册所需的组件:
@Configuration @ConfigurationProperties(prefix = "customProperties") public class MainConfiguration { String name; // get/set 方法省略 } 然后,我们需要在 application.
1、Spring Cache 的简介 Spring Cache 是 Spring 框架提供的一个缓存抽象层,用于简化应用中的缓存操作。它通过在方法执行期间将结果存储在缓存中,以便在相同的输入参数下,下一次调用时可以直接从缓存中获取结果,而不必执行相同的计算或查询操作。Spring Cache 支持多种缓存提供商,如 Ehcache、Redis、Caffeine 等,可以根据需求选择合适的缓存实现。通过使用 Spring Cache,开发人员可以轻松地添加缓存功能,提高应用的性能和响应速度。
Redis 是 Spring Cache 中最常用的缓存实现之一,有以下几个主要原因:
高性能:Redis 是一个基于内存的数据存储系统,具有非常高的读写性能。它将数据存储在内存中,可以快速地读取和写入数据,适合作为缓存存储。 数据结构丰富:Redis 支持多种数据结构,如字符串、哈希、列表、集合和有序集合等,这些数据结构的灵活性可以满足不同场景下的缓存需求。 持久化支持:Redis 提供了持久化机制,可以将数据存储到磁盘上,以防止数据丢失。这对于缓存数据的可靠性和持久性是非常重要的。 分布式支持:Redis 支持分布式部署,可以搭建多个 Redis 节点组成集群,实现数据的分片和负载均衡,提高了系统的扩展性和容错性。 生态系统丰富:Redis 有一个活跃的开源社区,提供了许多与 Spring 集成的库和工具,如 Spring Data Redis、Lettuce 和 Redisson 等,这些工具可以方便地与 Spring Cache 集成,简化了开发和配置的过程。 综上所述,Redis 在性能、数据结构、持久化、分布式支持以及生态系统方面的优势,使其成为 Spring Cache 中最常用的缓存实现之一。
本文将会指导你如何在 Spring Boot 中整合 Spring Cache 和 Redis 来开发缓存应用,并且修改其序列化方式为 JSON。
本文中使用的软件版本:
spring boot:3.1.3 redis:7.0.5 2、整合 Spring Cache 你可以点击 start.springboot.io 快速地创建此演示项目。
项目的依赖如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!
Spring Profiles 简介 通常,软件应用程序会在不同的环境中运行。在开发过程中,它将在 local 环境运行,然后我们可能会将它部署到 QA、Staging、Performance 环境中,最后再部署到 Production 环境中。在不同环境中运行应用程序时,你可能需要用不同的配置属性来配置应用程序。
例如,如果你使用了数据库,那么你可以在开发过程中将数据库连接属性配置为本地运行的数据库。在 QA、Staging、Performance 和 Production 环境中部署时,则需要将数据库属性配置为特定环境的数据库。
Spring 为 application properties 的外部化提供了强大的支持,因此我们可以在不同的环境中运行时配置不同的属性。
为了使其更简单,我们可以使用 Spring Profiles 机制。使用不同的 profile 来配置 application properties,然后根据需要启用所需的 profile。
使用 properties 配置 Profile 假设我们正在构建一个使用 PostgreSQL 数据库的 Spring Boot 应用程序。我们希望在本地运行应用程序,使用在笔记本电脑上运行的 PostgreSQL 数据库。此外,我们还希望将应用程序部署到 QA 和 Production 环境中。
我们可以在默认的 properties 文件 src/main/resources/application.properties 中配置默认属性,如下所示:
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password=postgres 我们可以在 src/main/resources/application-{profile}.{properties/yml} 文件中配置任何特定 profile 的属性,当你激活该 profile 时,Spring Boot 会自动使用该 profile 的属性。因此,我们可以按照以下方式在 src/main/resources/application-qa.properties 中配置 QA profile 的属性:
spring.datasource.url=jdbc:postgresql://postgres_qa:5432/postgres spring.
Spring Data JPA 是 Spring 框架提供的一个模块,用于简化与关系型数据库的交互和数据访问。它基于JPA(Java Persistence API)标准,并提供了一组易于使用的API和工具,帮助开发人员更轻松地进行数据库操作。通过Spring Data JPA,开发人员可以通过编写简洁的代码来执行常见的 CRUD 操作,同时还支持高级查询、分页、事务管理等功能。它的目标是提供一种更简单、更高效的方式来处理数据库操作,减少开发人员的工作量,并提高应用程序的可维护性和可扩展性。
本文将会指导你如何在 Spring Boot 应用中整合、使用 Spring Data Jpa。
软件版本:
Java:17 Spring Boot:3.1.3 MySQL:8.0.27 创建工程 点击 start.springboot.io 快速创建 Spring Boot 整合 Spring Data Jpa 的示例应用。
我们选择了 spring-boot-starter-web、spring-boot-starter-data-jpa、mysql-connector-j 和 spring-boot-starter-test 依赖。
pom.xml 如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> spring-boot-starter-data-jpa 默认使用 Hibernate 作为 JPA 实现。本文使用 MYSQL 数据库进行演示,如果你使用其他数据库需要修改驱动。
1、概览 当我们在 IDE 中运行代码分析工具时,它可能会对带有 @Autowired 注解的字段发出 “Field injection is not recommended” 的警告。
在本教程中,我们将探讨为什么不推荐字段注入,以及我们可以使用哪些替代方法。
2、依赖注入(DI) 依赖注入是一种设计模式,用于管理对象之间的依赖关系。它通过外部容器提供对象的依赖,使得对象之间的关系更加灵活、可配置和可测试。依赖注入提高了代码的可维护性、可测试性和可扩展性。它是 Spring 框架的核心功能之一。
我们可以通过三种方式注入依赖对象,即:
构造函数注入。 Setter 方法注入。 字段注入。 第三种方法是使用 @Autowired 注解将依赖直接注入类中。虽然这可能是最简单的方法,但它可能会导致一些潜在的问题。
更重要的是,即使是在 Spring 的官方文档 中,也不再介绍字段注入。
3、Null 安全 让我们定义 EmailService 类并使用字段注入 EmailValidator 依赖:
@Service public class EmailService { @Autowired private EmailValidator emailValidator; } 现在,让我们添加 process() 方法:
public void process(String email) { if(!emailValidator.isValid(email)){ throw new IllegalArgumentException(INVALID_EMAIL); } // ... } 我们可以使用默认构造函数直接创建 EmailService 实例。但只有在提供了 EmailValidator 依赖的情况下,EmailService 才能正常工作。
EmailService emailService = new EmailService(); emailService.
1、简介 在本教程中,我们将介绍如何使用 PostgreSQL 的 LISTEN / NOTIFY 命令来在 Spring Boot 应用中实现简单的 MQ。
2、PostgreSQL 的 LISTEN/NOTIFY 机制简介 简单地说,这些命令允许连接的客户端通过普通的 PostgreSQL 连接交换信息。客户端使用 NOTIFY 命令向 channel 发送通知以及可选的 string payload。
channel 可以是任何有效的 SQL 标识符,其工作原理与传统 MQ 系统中的 topic 类似。这意味着 payload 将发送给该特定 channel 的所有活动的监听器(listener)。如果没有 payload,监听者只会收到一个空通知。
要开始接收通知,客户端需要使用 LISTEN 命令,该命令将 channel 名称作为唯一参数。该命令会立即返回,因此客户端可以使用同一连接继续执行其他任务。
通知机制具有一些重要的特性:
channel 名称在数据库中是唯一的。 客户端使用 LISTEN/NOTIFY 时无需特殊授权。 在事务中使用 NOTIFY 时,客户端只有在事务成功完成时才会收到通知。 此外,如果在一个事务中使用相同的 payload 向同一 channel 发送多个 NOTIFY 命令,客户端将只收到一个通知。
3、使用 PostgreSQL 作为 Message Broker 的场景 鉴于 PostgreSQL 通知的特性,我们不禁要问,什么时候使用它而不是 RabbitMQ 或类似的成熟 message broker。这需要权衡利弊。一般来说,选择后者意味着:
1、概览 在 web 开发过程中,经常会遇到 HTTP 403 forbidden error。
在本教程中,我们将学习如何解决 Spring Boot POST 请求中的 403 错误。我们将首先了解 403 错误的含义,然后探讨在 Spring Boot 应用程序中解决该错误的步骤。
2、403 Error 是什么? HTTP 403 错误(通常称为 “Forbidden” 错误)是一种状态代码,表示服务器理解了请求,但选择不授权。这通常意味着客户端没有权限访问请求的资源。
需要注意的是,该错误不同于 401 错误,后者表示服务器需要对客户端进行身份认证,但尚未收到有效凭证。
“401” 表示需要认证,“403” 表示认证过了(不需要认证),但是没有权限。
3、导致 403 Error 的原因 在 Spring Boot 应用程序中,有几个因素会触发 403 错误。其中之一就是客户端未能提供身份认证凭据。在这种情况下,服务器因无法认证客户端的权限而拒绝请求,从而导致 403 错误。
另一个可能的原因在于服务器配置(server configuration)。例如,出于安全原因,服务器可能被配置为拒绝来自某些 IP 地址或用户代理(user agent)的请求。如果请求来自这些被阻止的资源,服务器会响应 403 错误。
此外,Spring Security 默认启用跨站请求伪造(CSRF)保护。CSRF 是一种通过欺骗受害者提交恶意请求并利用受害者的凭证代表其执行非预期功能的攻击。如果用于防范此类攻击的 CSRF token 丢失或不正确,服务器也可能会响应 403 错误。
4、项目设置 要了解如何解决 403 错误,让我们创建一个带有 spring-boot-starter-web 和 spring-boot-starter-security 依赖的 Spring Boot 项目:
1、概览 通过 REST API 更新资源时,可以使用 PATCH 方法。该方法专门用于“更新部分字段”的场景。当需要完全更改现有资源时(全量替换),可以使用 PUT 方法。
在本教程中,我们将学习如何在 OpenFeign 中设置 HTTP PATCH 方法。我们还将演示在 Feign client 测试 PATCH 方法时出现的异常情况,以及解决方案。
2、Spring Boot 中的应用示例 假设我们需要构建一个简单的微服务,调用下游服务进行部分更新。
2.1、Maven 依赖 首先,我们要添加 spring-boot-starter-web 和 spring-cloud-starter-openfeign 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 2.2、实现 Feign Client 现在,让我们使用 Spring Web 注解在 Feign 中实现 PATCH 方法。
首先,让我们建立一个 User model,它有几个简单的属性。
public class User { private String userId; private String userName; private String email; } 接下来,我们将使用 updateUser 方法来实现一个 UserClient 接口:
在本文中,你将学习如何使用 Spring Boot 内置的 Testcontainers 和 Docker Compose 支持,在开发模式下运行外部服务。Spring Boot 在当前的最新版本 3.1 中引入了这些功能,你已经可以在 Spring Boot 应用的测试中利用 Testcontainers。在应用程序启动时运行外部数据库、message broker 或其他外部服务的功能是我一直期待的。尤其是竞争框架 Quarkus 已经提供了名为 Dev Services 的类似功能,这在我的开发过程中非常有用。此外,还有另一个令人兴奋的功能 - 与 Docker Compose 集成。
源代码 如果你想自己尝试,可以查看我的源代码。因为我经常使用 Testcontainers,所以你可以在我的多个仓库中找到示例。下面是我们今天要使用的仓库列表:
https://github.com/piomin/sample-spring-boot-on-kubernetes.git https://github.com/piomin/sample-spring-microservices-advanced.git https://github.com/piomin/sample-spring-kafka-microservices.git 你可以克隆它们,然后按照指导查看如何在开发模式下使用 Spring Boot 内置的 Testcontainers 和 Docker Compose 支持。
在测试中使用 Testcontainers 让我们从标准使用示例开始。第一个仓库中有一个连接 Mongo 数据库的 Spring Boot 应用程序。为了构建自动测试,我们必须包含以下 Maven 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>mongodb</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>junit-jupiter</artifactId> <scope>test</scope> </dependency> 现在,我们可以创建测试了。我们需要用 @Testcontainers 来注解我们的测试类。然后,我们必须声明 MongoDBContainer Bean。在 Spring Boot 3.