- 博客(28)
- 收藏
- 关注
原创 高级 Java 并发:模式和最佳实践
Java 是一种多功能且功能强大的编程语言,它已经发展到包含强大的并发支持,使开发人员能够创建高性能、可扩展的应用程序。本文深入介绍了 Java 中的高级并发模式和最佳实践,使开发人员能够掌握应对复杂并发挑战和优化其应用程序的知识。Java 中的 Executors 框架提供了用于管理线程池的高级 API,使得更轻松高效地处理大量并发任务。在此示例中,使用计划线程池定期执行任务,从初始延迟后一秒开始,然后每三秒执行一次。在此示例中,使用固定线程池来管理 Web 服务器,同时处理多个客户端连接。
2025-01-02 12:09:45
467
原创 Java 中的多线程
使用公平锁时,如果多个线程正在等待,则等待时间最长的线程将获得下一个锁。相比之下,非公平锁允许线程“插队”,这可能提供更好的性能,但如果其他线程频繁获取锁,则存在某些线程无限期等待的风险。多个读取者可以获取读取锁而不会相互阻塞,但当一个线程需要写入时,它必须获取写入锁,以确保独占访问。例如,一个核心可处理网络浏览器,另一个核心可处理音乐播放器,另一个核心可处理下载管理器,还有一个核心可处理后台系统更新。当 Java 程序启动时,会立即有一个线程开始运行,这个线程称为主线程,负责执行程序的 main 方法。
2024-12-31 19:00:18
978
原创 Java 内存泄漏:检测与预防
工具的选择通常取决于项目的具体要求和开发团队的偏好。通过了解常见原因、使用正确的检测工具以及遵守编码和内存管理方面的最佳实践,开发人员可以显著减少这些问题的发生。这些工具包括 JDK 中包含的标准分析和监控工具,以及提供更详细分析和用户友好界面的高级第三方应用程序。通过识别内存泄漏的原因和症状并使用适当的工具进行分析,开发人员可以显著提高 Java 应用程序的性能和可靠性。JFR 可用于记录正在运行的应用程序的数据,然后可以使用 JMC 进行分析以了解内存分配模式、识别内存泄漏并优化内存使用情况。
2024-12-31 18:36:18
972
原创 每个 Java 开发人员都应该掌握的 Spring Boot 高级概念
与 Spring Boot 集成的 Resilience4j 提供了断路器、重试和速率限制器等模式。Spring Cloud Gateway 是一个反应式 API 网关,它取代 Netflix Zuul 以获得更好的性能和灵活性。这只是有关高级 Spring Boot 功能的重要且必备知识的一瞥,这些功能可以帮助您构建健壮、可扩展且安全的企业应用程序。Spring Boot 的简单性常常掩盖了其处理复杂企业需求的能力。使用 Spring Boot 和 Kafka 的 Saga 模式。
2024-12-27 12:01:40
1022
原创 NGINX高手的终极指南
Nginx 是一款强大而高效的 Web 服务器,广泛应用于现代 Web 基础设施。与使用多线程架构的传统 Web 服务器不同,Nginx 采用非线程、事件驱动的架构。这种设计允许 Nginx 同时处理更多连接,非常适合高流量网站。除了提供静态网页之外,Nginx 还功能多样,可以配置为执行各种角色,包括负载平衡、HTTP 缓存和充当反向代理。这些功能使其成为许多复杂 Web 架构的基石。正向代理与反向代理为了理解 Nginx 作为反向代理的作用,首先区分正向代理和反向代理会很有帮助。
2024-12-26 17:31:26
740
原创 将 SOLID 原则应用于 Spring Boot 应用程序
中的五项设计原则,旨在创建更易于维护、更灵活、更可扩展的软件。这也使得进行小改动变得很棘手,因为它们可能会影响代码的其他部分,即使是很小的更新也需要测试所有内容。SOLID 原则在面向对象编程 (OOP) 中至关重要,因为它们提供了一组指南和最佳实践来设计更易于维护、更灵活和可扩展的软件。在本文中,我们首先讨论了在 Java 应用程序中应用 SOLID 原则的错误。总而言之,该服务动态处理这些实现,从而可以轻松添加新功能而无需更改现有代码,遵循开放封闭原则。让我们在下面的例子中检查一下错误的用法。
2024-12-26 15:09:02
1229
原创 我的软件架构师——Java 职位面试经历。
查询服务将使用这些事件,并拥有自己的存储(可能是 Elastic Search),并以所需的形式存储数据,这些形式是基于业务需求的查询。它还提供了漂亮的 UI,以便您可以查看各种组件的部署状态,甚至可以查看日志。另一方面,UDP(用户数据报协议)是一种无连接协议,无需建立连接即可发送数据包,因此速度更快,但可靠性较低,因为它无法保证交付或顺序。构建镜像:当新代码合并到目标分支时,我们可以使用 GitHub 操作来运行构建,此 GitHub 操作将自动启动一个作业,我们可以利用它来构建 docker 镜像。
2024-12-25 20:17:48
5064
原创 如何在 Spring Boot 中创建自定义注释以获得更清晰的代码
想象一下,能够创建自己的注释来封装重复的代码模式,使您的代码不仅更干净,而且更易于维护。在本文中,我们将探讨如何在 Spring Boot 中制作自定义注释,以简化您的开发过程并帮助您避免冗余代码的麻烦。此自定义注释背后的想法是消除方法中重复错误处理代码的需要。这意味着注释将在运行时可用,这对于需要在应用程序执行期间检查注释的框架或自定义逻辑来说是必需的。让我们将自定义注释添加到我们的方法中,看看当该方法发生异常时会发生什么。现在让我们将这个注释添加到我们的方法中并看看它是如何工作的。
2024-12-25 14:30:00
853
原创 如何在 Spring Boot 微服务中设置和管理多个数据库
在现代微服务架构中,通常需要与多个数据库交互的服务。这可能是由于各种原因,例如遗留系统集成、不同类型的数据存储需求,或者仅仅是为了优化性能。Spring Boot 具有灵活的配置和强大的数据访问库,可以轻松配置多个数据库。在本综合指南中,我们将探讨如何在 Spring Boot 微服务中设置和管理多个数据库连接。1. 简介微服务通常需要与各种数据库交互。每个微服务可能需要不同类型的数据库,例如用于事务数据的 SQL 数据库和用于非结构化数据的 NoSQL 数据库。
2024-12-24 22:16:21
1550
原创 数据存储设计面试:了解数据库分区、分片、索引
是一种在多个服务器或数据库之间水平划分数据的方法,这样每个服务器(或“分片”)都包含整个数据集的一个子集。此技术用于提高数据库的可扩展性和性能,尤其是在处理无法在单个服务器中容纳的超大数据集或单个服务器无法处理负载时。了解 postgres 或 sql 中聚集索引和非聚集索引如何存储在 B+ 树中非常重要,这个概念是经常被问到的。是一种用于提高数据库表上数据检索操作速度的技术,但会在数据插入、删除和更新期间增加额外的空间和开销。:根据键的范围将数据划分为多个分区(例如,按日期范围对销售数据进行分区)。
2024-12-24 17:25:01
1350
原创 使用 AOP 在 Spring Boot 中实现跟踪和日志记录
此外,Jaeger、Zipkin 和 OpenTelemetry 等分布式跟踪工具可以帮助您跟踪跨多个服务的请求,从而使微服务中的调试和监控变得更加容易。在现代应用程序中,尤其是使用微服务构建的应用程序,跟踪和日志记录在跟踪流经各种服务的请求方面起着至关重要的作用。从前端生成的代码在 Spring Boot 应用程序中实现跟踪和日志记录,我们还将探索在微服务环境中进行分布式跟踪的选项。有助于追踪用户在系统中的旅程,但在更复杂的微服务架构中,通常需要分布式跟踪工具才能获得跨多个服务的整体视图。
2024-12-23 17:12:10
1309
原创 理解 Spring Boot 架构流程
Spring Boot 是一个功能强大的框架,它通过提供预配置的设置简化了企业级应用程序的开发,使开发人员可以更加专注于编写业务逻辑而不是管理配置。在本文中,我们将深入研究典型 Spring Boot 应用程序的架构流程,帮助您了解组件如何交互以及请求从头到尾的处理方式。Spring Boot 架构流程旨在简化开发流程,为从客户端到服务器再返回的请求处理提供清晰高效的路径。当您运行 Spring Boot 应用程序时,它会根据类路径中可用的 JAR 依赖项自动配置您的应用程序。等的接口)与数据库交互。
2024-12-23 14:54:45
1043
原创 掌握 Spring Boot 中的 WebClient:何时以及为何使用它而不是 RestTemplate
WebClient 是一款功能强大、用途广泛且现代化的 Spring Boot 应用程序 HTTP 客户端,可帮助开发人员构建高效、反应灵敏且可扩展的系统。许多较旧的应用程序是在 WebClient 出现之前构建的,并且严重依赖 RestTemplate。则是现代、可扩展且反应灵敏的 Spring Boot 应用程序的首选。它提供了一种与 Web 服务交互的更有效方式,尤其是在需要高并发性和低延迟的场景中。仍然是许多 Spring Boot 应用程序中广泛使用的选项,尤其是在传统的同步架构中。
2024-12-20 16:54:08
2284
1
原创 Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
显然,当您想要从数据库中检索用户时,由于关联的登录历史记录实体,大量数据将付出代价。不幸的是,我们直到面对结果才意识到我们付出了代价,就像在生活中一样。如您所见,我们有实体,每个实体都有自己的存储库,这些存储库已在后台从 JpaRepository 接口扩展。JPA 存储库与 EntityManager 配合使用,它与 Hibernate 配合使用,后者与 JDBC 配合使用。最后,缓存机制是选择 Hibernate 实体缓存的最大原因,它使以数据为中心的应用程序具有高性能,即使应用程序远离数据库。
2024-12-19 19:21:47
968
原创 有关异步场景的 10 大 Spring Boot 面试问题
这些问题涵盖了广泛的主题,从基本的注释和配置到高级概念,例如使用 Spring WebFlux 进行反应式编程。在本文结束时,您将对如何利用 Spring Boot 中的异步编程来构建强大而高效的应用程序有深入的了解。,它将在单独的线程中运行,从而允许主线程继续处理而无需等待该方法完成。它提供了一种强大而灵活的方法来处理 Java 中的异步编程,允许您链接多个异步操作、处理异常以及组合多个未来。在 Spring Boot 中编写异步方法的单元测试需要使用一些工具和技术来处理和验证异步行为。
2024-12-18 17:16:55
941
原创 如何在 Spring Boot 中使用 Mapstruct
MapStruct是一个代码生成器,它基于约定优于配置的方法,大大简化了 Java bean 类型之间的映射实现。使用@Mapping注释时,我们可以轻松地定义它们,就像在OrderMapper.java中看到的那样。在这种情况下,我们可以使用 Mapstruct 轻松地从 User 映射到 UserDTO。就这样,如您所见,Mapstruct 易于使用、实现和在模型、dto 和响应之间进行映射。这里我们有用户模型,让我们想象一下,您不是返回整个模型,而是考虑返回 DTO。在本文中我们将举 2 个示例。
2024-12-18 12:14:24
646
原创 Java8 Stream编码问题
13. 给定 List<Employee>,获取一个包含部门和员工姓名的 Map,并绘制该部门的最高工资。3. 给定 List<String>,返回连接 List 所有字符串的字符串。18. 给定 List<Integer>,查找总和等于给定目标数字的数字对。6. 给定 List<String>,计算长度大于 4 的字符串的数量。15. 给定 List<Employee>,从列表中删除同名的员工。2. 给定 List<Employee>,查找薪水最高的员工。包含所有员工所有独特技能的表格。
2024-12-17 18:08:43
602
原创 如何@Transactional在 Spring Boot 中使用注解
Spring Boot,您可以声明式地管理事务,明确指定事务在各种情况下的行为方式。这有助于确保数据一致性并简化应用程序中的错误处理。注释来管理 Spring Boot 中的事务。在这篇博文中,我们将探讨如何使用它。来确保数据一致性并简化 Spring Boot 应用程序中的错误处理。,通常将其放在需要事务行为的服务类的方法上。具有事务方法的示例服务。2. 传播和隔离级别。
2024-12-17 15:40:48
601
原创 在 Spring Boot 3 中实现基于角色的访问控制
为了根据用户角色限制用户访问,我们必须在 Spring security 中启用该功能,这样我们无需编写自定义逻辑即可执行检查。默认情况下它是空的,但现在我们必须更新它以生成包含用户角色名称的列表。我们已经知道角色在系统中是持久的。因此,在创建用户之前,我们必须确保该角色存在于数据库中。我们将创建一个在应用程序启动时执行的函数,如果角色不存在则在数据库中创建角色。现在需要用户角色,因此创建没有用户角色的用户将引发错误。在系统中创建一个新的管理员,只有具有超级管理员角色的用户才能访问。
2024-12-17 11:47:07
977
原创 如何在 Spring Boot 应用程序中使用 WireMock 模拟外部 rest api 调用进行测试
我们用于说明如何使用 WireMock 的场景有两个微服务,分别称为订单服务和库存服务。订单服务中的下单端点将对库存服务的库存端点进行 http 调用,以检查产品是否有库存,如果库存充足,则创建订单。模拟外部 API 调用是集成或端到端测试中的常见做法,因为它允许开发人员将他们的代码与外部隔离。在集成测试和端到端测试中,我更喜欢使用 WireMock,因为使用 WireMock 我们也可以测试 http 交互,而 mockito 将模拟整个 http 调用方法。设置和使用 WireMock 的步骤如下;
2024-12-16 15:24:02
1216
原创 Spring Boot 中异常日志记录的最佳实践:实时示例
Spring Boot 中有效的异常日志记录包括捕获足够的上下文信息、使用适当的日志级别以及集中日志记录配置。异常日志记录是构建弹性且可维护的 Spring Boot 应用程序的关键方面。记录异常时,务必包含足够的上下文信息,以便了解发生了什么以及异常发生的原因。通过遵循这些规则,您可以确保异常日志记录有效、信息丰富,并有助于诊断和解决 Java 应用程序中的问题。说到 Java 中的异常日志记录,有几种最佳实践可以显著提高应用程序的可维护性和故障排除能力。允许您在一个全局位置处理整个应用程序的异常。
2024-12-16 14:54:01
986
原创 Java 中的内存管理:面试问题和答案
内存管理是 Java 编程的一个重要方面,理解它对于编写高效且性能良好的代码至关重要。以下是一些有关 Java 内存管理的最重要的面试问题,以及适用的详细解释和代码示例。答:Java 内存模型 (JMM) 定义了线程如何通过内存进行交互以及在多线程环境中允许哪些行为。答:Java 中的内存泄漏是由于不再需要的对象没有被正确地垃圾收集,因为对它们的引用仍然存在。答:垃圾收集(GC)是 JVM 通过删除应用程序中不再可访问的对象来自动回收内存的过程。3.Java 中的垃圾收集是什么?
2024-12-13 22:03:20
774
原创 如何在 Spring Boot 中使用Records和 MapStruct 创建 DTO
默认情况下,记录类中定义的所有字段都是私有的和最终的。JPA 实体不能转换为记录,因为除其他方面外,它们不能是最终的,并且必须提供 getter、setter 和无参数构造函数。看,没有访问修饰符,没有构造函数,没有样板,没有大量的 Lombok 注释(注释除外。但是使用 Lombok 时,您必须向类添加大量注释,上帝保佑您不会忘记其中任何一个。听起来配置映射器需要做很多麻烦的事情,但实际上,没有什么是 MapStruct 无法处理的。因此,下面您将找到有关将这两个强大的解决方案集成到您的项目中的教程。
2024-12-13 18:14:41
1085
原创 Java 8、Java 11、Java 17 和 Java 21全面比较
选择正确的 Java 版本取决于您的应用程序的特定需求,但转向最新的 LTS 版本(如 Java 17 或 21)将使您的应用程序面向未来并提供性能改进。发布,由于其稳定性和较长的支持周期,仍然是 Java 使用最广泛的版本之一。发布,是 Java 8 之后的第一个 LTS,标志着现代 Java 的开始。Java 不断发展,每个新版本都会带来增强功能、弃用功能和新功能。:一个稳定的 LTS 版本,提供现代功能,同时仍然与旧系统兼容。:由于其现代功能和长期支持的平衡,最受推荐的 LTS 版本。
2024-12-12 20:03:50
3496
1
原创 Java 面试问题:Java 8 功能相关问题
`Collectors.toList()`、`Collectors.groupingBy()` 和 `Collectors.joining()` 等新特性允许实现更具表现力和可读性的集合操作。— 我使用 `java.time` 来处理日期和时间,因为它是不可变的并且是线程安全的。— `Optional` 提供了一种表示可能缺失值的方法,并避免了显式的 `null` 检查。在我最近的项目中,我利用了几个 Java 8 功能来增强代码的可读性、性能和可维护性。——方法引用是直接调用方法的简写。
2024-12-12 16:03:15
844
原创 Java 面试题:Java 流
函数式接口是 Java 支持函数式编程的关键部分,尤其是自 Java 8 引入 Stream API 和 lambda 表达式以来。是流处理的默认类型,其中元素按照它们在源中出现的顺序一次处理一个。顺序流使用简单,适用于许多场景,尤其是当数据集较小或操作不占用大量 CPU 时。无论你是刚入职,还是有 3 年经验,还是有 11 年经验,这都是所有公司最热衷的话题。做好充分的准备对于 Java 流非常重要,因为这是面试官最常问的话题。请记住,流是一种管道,如果仅应用中间操作,则不会产生任何结果。
2024-12-11 22:30:33
279
原创 面试中常见的Java 中的泛型<>
使用泛型,您可以编写适用于不同类型的代码,同时强制执行编译时类型安全。泛型允许类和方法对任何指定类型进行操作,从而使代码类型安全且可重用。有界类型允许您指定类型上的约束,确保泛型仅适用于满足特定条件的类型(如扩展数字),从而减少运行时错误。我们可以看到,不需要强制类型转换,也不需要传入任何泛型类型参数。泛型方法允许您定义具有类型参数的方法,使它们能够与运行时指定的任何类型一起使用。类型推断是指编译器可以通过查看方法参数的类型来推断泛型类型。通用类允许您定义可与用户指定的任何类型的类一起使用的类。
2024-12-11 15:23:59
995
原创 在 Spring Boot 中构建 API 响应的最佳方法
构建结构良好且一致的 API 响应是开发高效、用户友好且易于维护的 Spring Boot 应用程序的关键要素。一个设计优良的响应不仅能够提升 API 的易用性,还能简化调试过程和第三方系统的集成。结构良好的 API 响应可以显著提高 Spring Boot 应用程序的可用性和可维护性。通过采用标准格式、利用通用响应包装器和使用实用程序类,您可以构建令人愉悦的 API。标准化 API 响应的常用方法是将数据包装在响应对象中。这确保每个成功的响应都遵循一致的格式。结构化 API 响应的好处。
2024-12-10 22:44:39
393
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人