提高Spring Boot技能的9种方法

以下是提高 Spring Boot 技能的 9 种方法:

1. 外部化您的配置:
充分利用 Spring Boot 潜力的另一种方法是尽可能地尝试外部化您的配置,而不是对其进行硬编码。外部化您的配置将使您的应用程序更加灵活且更易于管理。

外部化配置的另一个优点是,您不需要仅仅因为一个小更改就关闭应用程序、进行更改、重新编译,然后重新部署应用程序。

以下是如何外部化您的配置
要外部化您的配置,您需要使用 application.properties 或 application.yml
– 配置您的属性:
在 application.properties 或 application.yml 文件中,使用配置的前缀指定属性:

 application.properties

app.bootstrap-servers=localhost:3000
app.client-id=digma-id
app.group-id=dgma-group
For application.yml

application.yml
app:
bootstrap-servers: localhost:3000
client-id: digma-id

- 创建配置属性类:

创建一个类来保存配置属性。用 @ConfigurationProperties 对其进行注解,以指定属性的前缀:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data
@Data
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String bootstrapServer;
private String clientId;
private String groupId;
}

- 注入配置:

将配置属性注入到组件或服务中:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DemoService {
private final AppProperties appProperties;
private final Logger logger = LoggerFactory.getLogger(DemoService.class);
public DemoService(AppProperties appProperties) {
this.appProperties = appProperties;
}
public void printConfiguration() {
logger.info("App Name: {}", appProperties.getBootstrapServer());
logger.info("Version: {}", appProperties.getClientId());
logger.info("Version: {}", appProperties.getGroupId());
}
}

2.你需要保持你的控制器精简
充分利用 Spring Boot 潜力的另一种方法是确保控制器保持精简。保持控制器精简将帮助您避免导致“肥胖控制器”反模式的做法。
什么是“脂肪控制器”反模式?
“胖控制器”反模式是一种编程模式,其中 Web 应用程序中的控制器因业务逻辑而过载,违反了关注点分离原则。当控制者承担过多的责任时,必然会出现以下问题:

  • 可维护性:大型控制器难以维护和理解。对业务逻辑的任何修改或添加都变得容易出错且复杂。

  • 可测试性:随着业务逻辑嵌入到控制器中,单独执行测试变得困难,这使得创建可靠的单元测试变得具有挑战性。

  • 可重用性:您很难在控制器中找到可重用的逻辑。如果应用程序的另一部分需要相同的逻辑,通常很难提取和重用。

  • 可读性:当控制器中有业务逻辑时,代码库的可读性就会降低。开发人员很难快速了解控制器的用途和功能。

为了避免“脂肪控制器”反模式,请遵循以下原则:

  • 无状态:默认情况下控制器是单例的,任何状态更改都可能导致很多问题。
  • 委托:您的控制器应该进行委托,这意味着它不应该执行业务逻辑,而应该依赖委托。
  • 封装:应用程序的 HTTP 层应该由控制器处理,而不应该由服务层处理。
  • 以用例为中心:确保您的控制器是围绕用例或业务领域构建的。

3. 全局处理异常
要充分利用 Spring Boot,您需要学习如何全局处理异常,这很重要,因为:

  • 它为您提供了对 HTTP 响应的细粒度控制,允许您根据异常类型返回自定义对象或响应。

  • 您可以定义应全局应用的其他配置,例如模型属性或响应。

  • 它可以防止每个控制器中出现重复的异常处理代码。您可以在 @ControllerAdvice 类中定义一次,确保采用一致且集中的异常处理方法,使我们的代码更易于维护。

要全局处理异常,您需要创建一个类并使用此注解来注释该类@ControllerAdvice(Web MVC 项目)@ControllerAdvice(Web MVC 项目)(Web API 项目)。@RestControllerAdvice 或
@ControllerAdvice 是为 Spring Boot MVC 应用程序设计的,它是一个注解,当应用于某个类时,会将其转换为全局控制器顾问程序,进而影响多个控制器。下面是 @ControllerAdvice 的样子。

@ControllerAdvice
public class GlobalControllerAdvice {
// Exception handling, model attributes, and other configurations
}

@RestControllerAdvice 此注解扩展了 @ControllerAdvice。它专为 RESTful 网络服务而设计。您可以在响应形式为 JSON 或 XML 的应用程序中使用它。下面是它的样子。

@RestControllerAdvice
public class ControllerAdvice {
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(ResourceNotFoundException.class)
public ServiceResponse
handleResourceNotFoundException(ResourceNotFoundException ex) {
return new ServiceResponse<>(ex.getMessage(), false);
}

@ExceptionHandler 此注解用于处理控制器抛出的特定异常。此注解用于在控制器或类中声明使用 @ControllerAdvice 注解的方法。通过该注解,您可以自定义应用程序的行为。下面是它的外观。

@Service
@RequiredArgsConstructor
public class UserService {

private final UserRepository userRepository;
var response = new ServiceResponse ();
var user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User", "id", id));
UserDto userDto = mapper.toDto(user);
response.setData(userDto, true);
log.info("Fetched user => {}", userDto);
return response;
}

在 Spring Boot 应用程序中使用 @ControllerAdvice 或 @RestControllerAdvice 允许您在 Spring Boot 应用程序的多个控制器中集中异常处理和其他配置。

4.利用延迟初始化
SpringApplication 允许您作为开发人员延迟初始化您的 Spring Boot 应用程序。当启用延迟初始化时,bean 将在需要时创建,而不是在应用程序启动期间创建。启用延迟初始化可减少应用程序启动所需的时间。

延迟初始化会导致许多与 Web 相关的 Bean 在收到 HTTP 请求之前不会进行初始化。

延迟初始化的缺点是它延迟了应用程序问题的发现。如果您延迟初始化配置错误的 bean,则该 bean 在启动期间不会发生故障,并且只有在初始化该 bean 时才会出现问题。

您需要确保 JVM 有足够的内存来容纳应用程序的所有 Bean,而不仅仅是那些在启动期间初始化的 Bean。在启用延迟初始化之前,您需要微调 JVM 的堆大小。

可以使用以下方式以编程方式启用延迟初始化:

  • SpringApplicationBuilder 上的方法lazyInitialization
  • SpringApplication 上的 setLazyInitialization 方法。
  • spring.main.lazy-initialization 属性

5.充分利用STARTER POM
就像 AutoConfiguration 消除了配置通用功能的痛苦一样,Starter POM 消除了在以下环境中查找和配置通用依赖项的痛苦您的项目。
spring-boot-starter-data-jpa 是使用 Spring Data JPA 的入门工具。它包括以下编译的依赖项:

  • spring-boot-starter-jdbc:此启动器包含 JDBC 必需的库。

  • hibernate-core:这是 Hibernate 的主要库,它是一个对象关系映射 (ORM) 解决方案。

  • spring-data-jpa:此库提供核心 Spring Data JPA 功能。

  • spring-boot-starter-aop:该库支持 Spring Boot 中的面向方面编程,解决了横切问题,实现更简洁、模块化的代码。

  • spring-aspects: 当您需要 AspectJ 提供的高级功能(例如编织到第三方库)时,通常会使用此库。

因此,您无需搜索并添加所有这些依赖项并担心它们的兼容版本,只需添加一个 Starter POM — spring-boot-starter-data-jpa

6.使用SPRING BOOT CLI
Spring Boot CLI是Spring Boot团队提供的命令行工具。该工具允许您创建 Spring Boot Web 应用程序。显然,您需要安装它才能使用它,以下是安装方法。

On Mac:
$ sdk install springboot 

On Windows:
> scoop bucket add extras
> scoop install spring boot 

7. 掌握您偏好的构建工具
充分利用 Spring Boot 的一种方法是掌握您喜欢的构建工具。如果您更喜欢 Maven 或 Gradle 构建工具,则必须掌握它,了解其缺点,并且同样知道如何减轻您偏好的构建工具的缺点。
Maven 构建工具的一个常见抱怨是速度慢,缓解这一缺点的最佳方法是安装和使用Mvnd
Gradle 构建工具的一个常见缺点是方法名称一直在变化,因此缓解这一问题的唯一方法是让自己及时了解每个新版本的 Gradle 附带的新功能和已弃用的功能。

8. 认真对待可观察性
可观察性基本上是使用日志、指标和跟踪等外部输出来测量应用程序内部状态的过程。
Spring Boot 应用程序中的可观察性

执行器端点
确保充分发挥 Spring Boot 潜力的一种方法是使用 Spring Boot 执行器。该库允许您深入了解有关应用程序的操作信息。
一旦该库位于类路径上,默认情况下您就可以使用多个端点。
将 spring-boot-actuator 依赖项添加到包管理器以启用 spring-boot 执行器。

For Maven

org.springframework.boot spring-boot-starter-actuator

For Gradle

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

您需要知道的一点是,Actuator 的大部分端点都已禁用,只剩下 /health 和 /info 这两个端点处于启用状态。

要启用所有端点,请转到应用程序属性文件(application.properties)或应用程序文件(application.yml),然后添加以下内容

For application.properties
management.endpoints.web.exposure.include=*

For application.yml
management:
endpoints:
web:
exposure:
include: "*"

一些有趣的执行器端点

  • /health: 此端点向您显示应用程序的基本健康信息。它是最常用的端点之一,并且默认情况下公开。

您可以将此端点与外部监控工具(例如 Grafana、Prometheus)集成,以便在应用程序的运行状况发生变化时收到警报。

  • /info:此端点将向您显示应用程序信息。当您想要公开应用程序名称、版本和任何自定义属性等详细信息时,这非常有用。

从该端点获取的详细信息可以帮助其他开发人员或系统了解您的应用程序上下文。

  • /beans:此端点向您显示应用程序中所有 Spring bean 的完整列表。 

当您想要分析 bean 依赖性、调试依赖注入问题并尝试了解应用程序的结构时,这会派上用场。

  • /loggers:此端点向您显示应用程序中记录器的配置。 

使用此端点,您可以动态调整应用程序日志级别,启用/禁用特定包的日志记录。当您想要在运行时进行实时调试和故障排除时,这会派上用场。

  • /httptrace:此端点显示应用程序的 HTTP 跟踪信息。默认情况下,它仅显示最后 100 个 HTTP 请求-响应交换。

此端点对于诊断和分析应用程序的 HTTP 流量的行为非常有用,并帮助您识别和解决问题。

  • /metrics:此端点是应用程序指标。这些指标可以包括 JVM 内存使用情况、HTTP 请求计数等。此端点需要依赖于 micrometer-core。

此端点可帮助您监控应用程序的性能、检测异常并就如何优化或调整基础设施做出明智的决策。

  • /shutdown:当您到达此端点时,它将正常关闭您的 Spring Boot 应用程序。这是一项危险的操作,因此应妥善保护此端点。

谨慎使用此端点;在需要正常关闭的受控环境中使用此端点。

  • /env:此端点显示应用程序环境中定义的属性。这些属性可以包括系统属性、环境变量以及 application.properties 或 application.yml 中的属性。

该端点将帮助您了解应用程序的运行时环境、检查配置值、诊断和分析与配置相关的问题。

  • /mappings:此端点显示应用程序中所有 @RequestMapping 路径的列表。

通过此端点,您可以快速查看控制器的映射,这对于 API 文档来说非常方便。

  • /configprops:此端点显示整理的 @ConfigurationProperties 列表。

您可以查看属性的结构,找到错误配置,并确保您的应用程序使用正确的配置。
Spring Boot Actuator 通过 /actuator/health、/actuator/metrics 和 /actuator/env 等端点提供对应用程序内部结构的关键洞察。这些端点提供健康状态、详细指标和环境属性。

使Micrometer 收集指标
Micrometer 是一种多功能指标实用程序,支持各种监控系统,例如 Prometheus、Datadog 等。它提供了一系列仪器类型,是应用指标的首选解决方案,为选择监控工具提供了灵活性。

Spring Boot 中的日志记录Spring Boot 的日志记录依赖于 Commons Logging,但仍可适应不同的日志实现。它提供了 Logback、Log4J2 和 Java Util Logging 的默认配置,简化了日志记录设置和兼容性。

使用 OpenTelemetry 进行分布式跟踪
OpenTelemetry 在基于微服务的应用程序中提供端到端跟踪和可观察性。 Spring Boot 与 OpenTelemetry 无缝集成,支持代理检测和微米跟踪。使用生态系统工具引导您的可观察性并使可观察性数据变得有意义

digma.ai 等持续反馈工具可以使从不可观察性到完全可观察性的过程变得更加容易,但更重要的是,确保可观察性数据变得有影响力,而不仅仅是漂亮的仪表板。 Digma 和类似工具可以分析可观察性数据对您的代码意味着什么,以检测常见的反模式和问题,并在编码时为您提供反馈。

9. 测试,测试,测试
有了 Spring Boot,编写单元测试和集成测试就不再那么令人头疼,而是变得更令人满意。
Spring Boot 是开发具有强大测试功能的应用程序的绝佳选择。出于以下原因:

  • Spring Boot 与 JUnit、Mockito 和 Spring Test 等流行的测试框架无缝集成。

  • Spring Boot 提供了广泛的测试注释,包括 @SpringBootTest、@DataJpaTest 和 @WebMvcTest,它们有助于为特定类型的测试配置应用程序上下文,从而简化流程。

  •  Spring Boot 允许您利用 Spring 框架的庞大生态系统,例如用于安全测试的 Spring Security 和用于数据库相关测试的 Spring Data。

  • Spring Boot 对 Mockito 等模拟框架的支持使您可以访问用于生成测试数据的实用程序,从而使您能够构建更强大的应用程序。

  • Spring Boot 与 TestContainers 很好地集成,可以快速跟踪您的集成测试。

  • 如果您正在构建分布式应用程序,则测试是不可协商的。

测试驱动开发发生的一件伟大的事情是测试容器的使用。该开发相当新,值得庆幸的是 Spring Boot 集成了 Testcontainers。

Testcontainers 是一个功能强大的测试库,它提供简单且轻量级的一次性通用数据库实例,用于通过 Docker 容器中包装的真实服务引导集成测试。使用测试容器,您可以编写和运行与生产中使用的相同类型的服务或数据库对话的测试,而无需模拟或内存中服务。

测试容器的好处

  • 再现性:每个测试都在干净的环境中运行,因为这消除了可能由过时或冲突状态引起的任何问题。
  • 隔离:测试容器自动创建隔离的测试环境。这种隔离的环境有助于避免与外部依赖项的干扰。
  • 易于使用:TestContainers 与 JUnit、Mockito、TestNG 等流行测试框架之间无缝集成,因此降低了设置单独测试环境的复杂性这意味着您可以使用相同的环境(容器)来托管您的软件,无论您是在构建、测试还是部署您的软件在生产中的应用。

https://www.jdon.com/71031.html

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

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

相关文章

地质灾害监测预警解决方案

目录 1.前言 2.滑坡监测站建设方案 2.1建站方案 2.2监测指标体系 2.3监测设备配置 3.地面沉降监测建设方案 3.1建设方案 3.2监测指标体系 3.3监测设备配置 4.泥石流监测站建设方案 4.1建设方案 4.2监测指标体系 4.3监测设备配置 5.岩溶塌陷监测站方案 5.1建站方案…

利用openssl进行rsa加解密的例子

OpenSSL介绍 OpenSSL安装 https://blog.csdn.net/zhizhengguan/article/details/112846817 OpenSSL实例 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <ope…

深入理解网络 I/O:FileOutputStream、BufferFileOutputStream、ByteBuffer

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

状态管理@State

目录 一、简单类型的更新 二、class对象类型的变量 被该装饰器修饰的变量&#xff0c;在数据变化时会触发UI的刷新&#xff0c;也就是ArkTS UI中触发build()函数的调用&#xff0c;重新根据状态构建UI。如下更新是可以观察到的&#xff1a; 1、string number boolean 类型的数…

java8实战 lambda表达式、函数式接口、方法引用双冒号(中)

前言 书接上文&#xff0c;上一篇博客讲到了lambda表达式的应用场景&#xff0c;本篇接着将java8实战第三章的总结。建议读者先看第一篇博客 其他函数式接口例子 上一篇有讲到Java API也有其他的函数式接口&#xff0c;书里也举了2个例子&#xff0c;一个是java.util.functi…

Rust中Result处理方式

在Rust中有一个特殊的角色Result&#xff0c;是最常用的返回内容&#xff0c;如果是从其他语言转到Rust的话会觉得很别扭&#xff0c;很不习惯去处理Result&#xff08;至少我是这样的&#xff09;&#xff0c;所以今天整理一下在Rust中如何处理Result&#xff0c;也是自我整理…

java并发-ConcurrentHashMap 在Java7 和 8 的区别

文章目录 1.Java 7 版本的 ConcurrentHashMap2.Java 8 版本的 ConcurrentHashMap3.分析 Java 8 版本的 ConcurrentHashMap 的重要源码3.1.Node 节点3.2.put 方法源码分析3.3.get 方法源码分析 4.对比 Java7 和 Java8 的异同和优缺点4.1.并发度4.2.保证并发安全的原理4.3.遇到 H…

Jmeter实现CSV数据批量导入

CSV&#xff1a;逗号分隔值&#xff0c;是一种简洁且常见的数据存储格式。 1、参数化&#xff1a; 在Jmeter中&#xff0c;可以通过“用户自定义的变量”来实现参数化使操作方便&#xff0c;使用语法位&#xff1a;${参数名}&#xff0c;如下图&#xff1a; 而CSV也同理&…

本地文件内容搜索神器AnyTXT Searcher如何搭建与远程访问

文章目录 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过这种情况&#xff0c;异地办公或者不在公司&#xff0c;想找…

java注意项--更新中

前言&#xff1a; 1.大小写规定 1.1.类名和接口名&#xff1a;每个单词首字母大写。如GoodStudent&#xff1b; 是一个单词的时候首字母大写。如Student&#xff1b; 1.2.变量和方法名&#xff1a;第一个首字母小写&#xff0c;后序首字母大写。如firstName&#xff1b; 是一…

vue的语法模板与数据绑定的说明

vue的两大模板语法&#xff1a; 1.插值语法 2.指定语法 插值语法&#xff1a;{{}} 功能&#xff1a;用于解析标签体的内容 写法&#xff1a;{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性 指定语法&#xff1a; 功能:用于解析标签(包括:标签属性、标…

ChatGPT助力Excel数据分析:让你的工作事半功倍!

文章目录 一、ChatGPT简介二、ChatGPT在Excel数据分析中的应用1. 数据清洗2. 数据处理3. 数据分析4. 数据可视化 三、如何使用ChatGPT进行Excel数据分析1. 安装ChatGPT插件2. 输入问题或命令3. 查看结果并调整参数4. 导出结果并分享四、总结与展望 《巧用ChatGPT高效搞定Excel数…

苹果cms论坛多播放源自动采集 /采集在线影视网站/苹果CMS影视站采集器

源码介绍&#xff1a; 苹果cms论坛多播放源自动采集、采集在线影视网站&#xff0c;作为苹果CMS影视站采集器&#xff0c;它能轻松获取在线影视网站资源。 苹果 cms 论坛这是一个基于Vue和Gin实现的在线观影网站。项目采用 vite vue 作为前端技术栈, 使用 ElementPlus 作为 …

el-select 全选

<template><div class"container"><el-selectv-model"choosedList"clearablemultiplecollapse-tagsplaceholder"请选择"change"select_Change"><div style"padding: 0 20px; line-height: 34px">&l…

Linux字符设备号

一. 简介 为了方便管理&#xff0c;Linux 中每个设备都有一个设备号。 为了后面字符设备驱动的学习&#xff0c;本文了解一下 设备号组成与分配。 二. Linux字符设备号的组成与分配 1. 设备号的组成 设备号由主设备号和次设备号两部分组成&#xff0c;主设备号表示某一个…

JVM快速入门

JVM 字节码 字节码文件的组成 字节码由五个部分组成&#xff1a;基础信息 常量池 字段 方法 属性 基础信息&#xff1a; 魔数、字节码文件对应的版本号、访问标识&#xff08;public final&#xff09;、该类的父类索引、该类实现哪些接口的索引 魔数&#xff1a;文件无法…

顶级加密混淆混淆工具测评:ipagurd

摘要 JavaScript代码安全需求日益增长&#xff0c;因此JavaScript混淆工具的使用变得广泛。本文将对专业、商业JavaScript混淆工具ipagurd进行全面评估&#xff0c;通过比较其功能、操作便捷性、免费试用、混淆效果等方面&#xff0c;帮助开发者选择适合自己项目需求的工具。 …

期货平仓日历(期货平仓日期汇总)

什么是期货平仓日历&#xff1f; 期货是一种高风险高收益的投资品种。而期货交易不同于股票等其他投资品种的交易&#xff0c;期货交易需要在一定时间内才能买卖。而期货平仓日历就是指期货交易中规定的所有合约的平仓日期汇总。 常见期货平仓日期和时间&#xff1f; 不同的…

关于EasyExcel 合并单元格方法该如何实现

在做一个业务的导出&#xff0c;目前遇到一个需求&#xff0c;如下图&#xff1a; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metad…

在mt5上哪里可以添加指数品种?

在MT5交易平台上&#xff0c;您可以通过以下步骤添加指数品种&#xff08;如股票指数、商品指数等&#xff09;到您的市场观察窗口中&#xff1a; Exness手机登录平台学习指南 步骤一&#xff1a;打开市场观察窗口&#xff1a; 打开MT5交易平台。 在左侧的“市场观察”窗口中&…