本周七篇精心挑选的Java和Spring博文

精心挑选了一些值得一读的有趣的 Java 和 Spring 文章。这些文章包括 Spring AI、SQL 查询优化、Java 线程收集、记录 JFR 日志、Spring 安全最佳实践等主题。

1. Spring AI:如何用Java编写GenAI应用程序
Spring AI 是一个用 Java 构建生成式 AI 应用程序的框架。它提供了一组用于处理生成式 AI 模型和架构的工具和实用程序,例如大语言模型 (LLM) 和检索增强生成 (RAG)。

Spring AI 构建在 Spring 框架之上,Spring 框架是一种用于构建企业应用程序的流行 Java 框架,使那些已经熟悉或参与 Spring 生态系统的人能够将 GenAI 策略合并到他们现有的应用程序和工作流程中。

Java 中的 GenAI 还有其他选项,例如 Langchain4j,但本文将重点关注 Spring AI。

要点:

  • 本文讨论使用 Spring AI 框架通过 Java 构建生成式 AI (GenAI) 应用程序,特别关注检索增强生成 (RAG) 技术。
  • GenAI 是人工智能的一个子集,涉及创建文本、图像或音乐等新内容。
  • RAG 通过整合外部知识源来提高 AI 模型的准确性。


2. SQL查询优化:如何识别和优化慢SQL查询

  • 本文讨论识别和优化慢速 SQL 查询的策略,特别是在 PostgreSQL、MySQL、MSSQL 和 Oracle 等关系数据库管理系统中。
  • 它强调了查找慢查询时的常见挑战,例如查询量大、索引缺失、复杂性以及 Hibernate 等 ORM 框架的局限性。

为什么很难找到慢 SQL 查询?

  • 大量查询:当您对应用程序正在使用的数据库进行大量查询时,找到慢速 SQL 查询可能会很困难。
  • 缺少数据库索引:当数据库中的表缺少索引时,可能会导致 SQL 查询速度变慢,尤其是当 WHERE、JOIN、GROUP BY 和 ORDER BY 子句后面的列未建立索引时。
  • 复杂性:针对单个表或少量数据运行的 SQL 查询的执行速度比具有许多联接、子查询和聚合的 SQL 查询快得多。
  • 缺乏监控工具:Digma、pghero、Grafana、Prometheus 等监控工具在查找慢 SQL 查询方面发挥着重要作用,当开发人员由于某种原因没有这些工具时,手动查找慢 SQL 查询真的很难SQL 查询。
  • ORM 框架的泄漏抽象:像 Hibernate 这样的 ORM 框架确实可以加快开发速度,帮助您避免编写重复代码,提高应用程序安全性,并减少掌握和编写原始 SQL 查询的需要。

所有这些好处并不是没有一个主要缺点:臭名昭著的 N + 1 查询问题,这个问题围绕着 ORM 框架如何处理相关条目的延迟加载。

解决办法:

  • 添加索引后,查询的执行时间从 28 秒减少到 32 毫秒
  • 不同的 RDBMS 具有特定于它们的优化;熟悉您所选择的数据库系统(例如 MySQL、PostgreSQL、SQL Server)特有的功能和优化将为您的 SQL 优化过程奠定基础。
  • 使用参数化查询;它将消除数据库系统重新编译和优化查询计划的需要。
  • 通过调整磁盘使用、内存分配和网络配置来配置数据库以获得最佳性能。
  • 留意不需要的索引,因为当您运行使用 INSERT 或 UPDATE 命令的 SQL 查询时,这会影响应用程序的性能。
  • 检查运行 SQL 查询的表是否很大,并决定是否应该以数据库系统的查询优化器可以减少需要检查的行数的方式对表进行分区。
  • 确保正确索引 WHERE、JOIN 和 ORDER BY 子句之后的列。
  • 对于经常使用的查询,将它们放入存储过程中,因为它附带预编译的执行计划,因此可以节省您的时间。


3. Java集合及其线程安全版本

  • 本文讨论 Java 集合及其线程安全版本
  • 概述了各种 Java 集合及其线程安全版本,包括列表(ArrayList 和 LinkedList)、集合(HashSet 和 TreeSet)和映射(HashMap 和 TreeMap)。
  • 对于每种集合类型,都解释了标准实现及其线程安全替代方案

对于List:

  • ArrayList:根据需要增长的动态数组。随机访问速度很快,但插入和删除速度很慢。
  • LinkedList:双向链表,对于插入和删除非常有效,但对于随机访问速度较慢。

线程安全的替代方案:
  • CopyOnWriteArrayList:线程安全版本的ArrayList.当我们执行添加或修改元素等操作时,CopyOnWriteArrayList会创建底层数组的新副本。虽然这种方法可能很昂贵,但当读取操作的数量明显多于突变时,它就会变得高效。
  • Vector:Vector 是一种较旧的线程安全列表实现。它通过对所有操作(例如添加、删除和访问元素)使用同步方法来确保线程安全。虽然它提供了线程安全性,但这种同步会影响性能,尤其是在高度并发的场景中。
  • Collections.synchronizedList():我们也可以使用 Collections Utility 类创建线程安全列表。此函数返回一个支持特定列表的包装器 ( SynchronizedList )。包装器上的所有操作(获取、更新、删除等)都是同步的,这有助于提供线程安全,但可能会因同步而影响性能。

对于Set:

  • HashSet:不允许重复元素的无序集合。
  • TreeSet:按自然顺序或通过创建期间传递的比较器维护元素的排序集。

线程安全的替代方案:

  • ConcurrentSkipListSet:ConcurrentSkipListSet 是基于跳跃列表的线程安全排序集。
  • CopyOnWriteArraySet: CopyOnWriteArraySet 是 Set 接口的线程安全实现,由CopyOnWriteArrayList支持,即每个更新操作都会创建该集合的单独克隆副本。
  • Collections.synchronizedSet():我们也可以使用 Collections Utility 类创建线程安全集。此函数返回一个支持特定集的包装器 ( SynchronizedSet )。与SynchronizedList类似,SynchronizedSet中的所有操作都是同步的。

对于Map:

  • HashMap:存储键值对的无序映射。它不允许重复的键。
  • TreeMap:按自然顺序或通过创建期间传递的比较器维护键的排序映射。

线程安全的替代方案:
  • ConcurrentHashMap:高效的线程安全映射。地图分为多个段,每个段独立同步。它平衡了线程安全性和性能,使其适合多线程应用程序。
  • ConcurrentSkipListMap:它是排序映射的强大线程安全实现。它基于跳跃列表,这是一种允许高效搜索、插入和删除操作,同时保持排序顺序的数据结构。跳跃列表类似于平衡树,但使用概率平衡而不是严格的平衡规则。
  • Collections.synchronizedMap():我们也可以使用 Collections Utility 类创建线程安全映射。此函数返回一个支持特定 Map 的包装器 ( SynchronizedMap )。与SynchronizedList类似,SynchronizedMap中的所有操作都是同步的。


4.从容器远程记录JFR日志(不使用命令行)
Java Flight Recorder (JFR) 是记录和查看 JVM 和系统指标的首选技术。
JFR 记录 JFR 日志,这些日志揭示了有关正在运行的应用程序、JVM 的运行状况以及系统稳定性的大量信息。只需进入命令行/终端并输入一些命令即可轻松获取 JFR 日志。
但是,如果您无法直接在运行 JVM 的系统上访问命令行或终端(例如 JVM 在容器中运行时)怎么办?

  • 本文提供了有关在不使用命令行的情况下从容器远程记录 Java Flight Recorder (JFR) 日志的指南。首先强调了 JFR 在记录 JVM 和系统指标方面的重要性及其通过命令行命令的典型用法。
  • 但是,在无法直接访问命令行的情况下,例如当 JVM 在容器中运行时,本文提供了使用 JVM 的 JMX 连接器和 Azul Mission Control 的解决方案。

在 JVM 上设置 JMX
在命令行/终端之外访问 JVM 之前,必须先设置 JVM,使其可被远程连接发现和访问。您只需启用 JVM 的 JMX 连接器即可实现这一目的。

使用以下虚拟机参数配置 Java 应用程序:

  • -Dcom.sun.manage.jmxremote:启用 JMX/JMXRMI 连接。
  • -Dcom.sun.manage.jmxremote.host=[IP/主机名]:设置 JMX 连接的地址。使用外部 IP 地址或运行 Java 程序的计算机或容器的主机名。
  • -Dcom.sun.management.jmxremote.port=[端口]:设置 JMX 连接的 TCP 端口。
  • -Djava.rmi.server.hostname=[IP/主机名]:设置 JMXRMI 连接的地址。使用与 JMX 连接相同的 IP/主机名。
  • -Dcom.sun.management.jmxremote.rmi.port=[端口]:设置 JMXRMI 连接的 TCP 端口。使用与 JMX 连接相同的 TCP 端口。
  • -Dcom.sun.manage.jmxremote.local.only=false:如果从不同的机器连接到 JVM,则必须解除与 localhost 的端口绑定。
  • 此外,您可能需要使用以下命令启用 JMX 身份验证/SSL:

-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=true

例如:

-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.host=192.168.0.166 \
-Dcom.sun.management.jmxremote.port=7091 \
-Djava.rmi.server.hostname=192.168.0.166 \
-Dcom.sun.management.jmxremote.rmi.port=7091 \
-Dcom.sun.management.jmxremote.local.only=false \
‑Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \


5. 比较 Spring Boot 中的双因素身份验证方法
在 Web 应用程序安全中,双因素身份验证 (2FA) 已成为改善用户保护的基石。它充当了防止未经授权访问的重要屏障,使攻击者仅通过窃取密码来破坏用户帐户的难度大大增加。对于使用 Spring Boot 的开发人员来说,集成 2FA 不仅可以保护应用程序的安全,还可以向用户提供信任信号,表明他们致力于保护其数据。

本文探讨了各种双因素身份验证 (2FA) 方法,包括基于短信、基于电子邮件、推送通知、身份验证器应用程序、硬件令牌和生物识别验证。每种方法都将在 Spring Boot 应用程序的框架内进行检查,从用户体验的角度强调其实现、安全优势和潜在缺点。

  • 本文探讨了各种双因素身份验证 (2FA) 方法及其在 Spring Boot 应用程序中的实现。首先强调 2FA 在 Web 应用程序安全中的重要性及其在保护用户帐户免遭未经授权的访问方面的作用。
  • 涵盖的方法包括基于短信、基于电子邮件、推送通知、身份验证器应用程序、硬件令牌和生物识别验证,每种方法都根据实施、安全优势和用户体验考虑因素进行了剖析。

基于短信的 2FA 的优点和缺点
优点:

  • 高可访问性:几乎每部手机都可以接收短信,无需智能功能或互联网接入,确保广泛的可访问性。
  • 用户熟悉度:大多数用户熟悉通过短信接收和输入代码,从而缩短了与新安全措施相关的学习曲线。

缺点:
  • 安全风险:基于短信的2FA的根本弱点在于它容易受到各种攻击。网络钓鱼尝试可能会诱骗用户泄露其代码。 SIM 交换等更复杂的攻击涉及攻击者说服移动运营商将受害者的手机号码切换到新的 SIM 卡,从而有效劫持任何基于短信的验证码。
  • 网络依赖性:短信传送取决于移动网络的可用性,这在某些地理区域或网络中断期间可能不可靠,从而导致在关键时刻延迟或无法访问帐户。

基于电子邮件的 2FA 的优点和缺点
优点:

  • 广泛的可访问性:几乎每个人都有一个电子邮件帐户,这使得不同平台的用户都可以普遍访问该帐户。
  • 易于实施:基于电子邮件的 2FA 可以使用现有电子邮件基础设施轻松实施,并且大多数应用程序都支持。

缺点:
  • 安全漏洞:电子邮件帐户可能被盗用,并且电子邮件可能被攻击者拦截或访问,使得此方法的安全性低于其他方法。
  • 对电子邮件访问的依赖:用户必须有权访问其电子邮件帐户才能接收 2FA 代码,如果电子邮件服务关闭或无法访问,这可能会出现问题。

推送通知的优点和缺点
优点:

  • 高安全性:应用程序和用户设备之间的加密通信有助于防止拦截和未经授权的访问尝试。
  • 用户便利性:用户只需点击通知即可进行身份验证,与输入代码相比,可以提供无缝且快速的响应。

缺点:
  • 对互联网的依赖性:与基于代码的方法不同,推送通知要求用户的设备具有活动的互联网连接才能接收和响应通知。
  • 潜在的用户错误:如果用户不注意,仅点击通知的简单性可能会导致意外批准。

身份验证器应用程序的优点和缺点
优点:

  • 提高安全性:由于代码是在用户设备上生成的并且不穿越任何网络,因此它们不易受到拦截和其他形式的攻击(例如 SIM 交换)。
  • 无网络依赖性:用户无需互联网连接或蜂窝服务即可生成代码,从而使该方法在各种情况下更加可靠。

缺点:
  • 用户摩擦:用户必须安装应用程序并了解如何设置它,这可能会阻止某些人使用它,尤其是那些不太熟悉技术的人。
  • 设备依赖性:如果用户丢失设备或应用程序被删除,他们的帐户可能会被锁定,除非提供恢复代码或替代备份方法。

硬件令牌的优点和缺点
优点:

  • 高安全性:硬件令牌不连接到互联网,并且不受远程攻击的影响,这使得它们能够非常安全地抵御网络钓鱼、中间人攻击和其他常见威胁。
  • 用户简单性:对于最终用户来说,使用硬件令牌通常非常简单,只需按下设备上的按钮即可生成代码或只需将其敲击阅读器即可。

缺点:
  • 成本和可访问性:硬件令牌比其他 2FA 方法更昂贵,并且需要向每个用户分发物理设备,这在后勤方面可能具有挑战性且成本高昂,尤其是在大型组织中。
  • 丢失或损坏:如果令牌丢失或损坏,用户在获得替换令牌之前将无法访问其帐户,这可能会造成极大的不便和潜在的安全风险。

增强令牌用户体验和安全性
为了在 Spring Boot 中实现硬件令牌时优化安全性和用户体验,请考虑以下策略:

  • 设备管理:实施强大的设备管理系统来跟踪和管理硬件令牌的分配和状态。
  • 紧急访问:在硬件令牌不可用时提供紧急访问机制,例如备份代码或辅助身份验证方法。
  • 用户培训:教育用户如何正确使用和保养其硬件令牌,以及报告设备丢失或被盗的流程。

硬件令牌为 Spring Boot 应用程序提供了极其安全的 2FA 选项,特别适合安全性不能受到损害的环境。虽然它们的成本更高并且需要更多的管理,但它们提供的安全级别通常证明了关键应用程序中的这些缺点是合理的。

生物识别验证的优点和缺点
优点:

  • 高安全性:生物识别技术对于每个人来说都是独一无二的,并且难以复制,可提供高水平的安全性,防止未经授权的访问。
  • 易于使用:生物识别技术为用户身份验证提供了一种快速便捷的方法,通常只需看一眼或触摸一下即可。

缺点:
  • 硬件依赖性:需要配备生物识别传感器的设备,这可能会限制某些用户的可访问性。
  • 隐私问题:处理和存储生物识别数据会带来严重的隐私问题,需要严格遵守数据保护法规。

2FA 方法的比较分析
在本文中,我们探讨了几种双因素身份验证 (2FA) 方法,每种方法都有其独特的优点和局限性。为了帮助您确定哪种方法最适合您的 Spring Boot 应用程序,以下是针对安全性、可用性和实现复杂性的比较概述。
安全

  • 基于短信的 2FA:中等安全性。容易受到 SIM 交换和拦截攻击。
  • 基于电子邮件的 2FA:低到中等安全性。如果电子邮件系统本身没有得到适当的保护,则容易受到帐户泄露的影响,并且安全性低于其他方法。
  • 推送通知:高安全性。加密消息可降低被拦截的风险,但取决于用户设备的安全性。
  • 身份验证器应用程序:高安全性。不易受到传输拦截,但依赖于用户设备的物理安全。
  • 硬件令牌:安全性非常高。几乎不受远程攻击的影响,但可能会丢失或被盗。
  • 生物识别验证:非常高的安全性。尽管受到复杂的欺骗技术的影响,但复制生物特征极其困难。

可用性
  • 基于短信的 2FA:高可用性。被广泛理解并且易于用户实施。
  • 基于电子邮件的 2FA:高可用性。拥有电子邮件帐户的任何人都可以访问,但取决于对电子邮件服务的访问。
  • 推送通知:可用性非常高。用户只需轻按一下即可进行身份验证,既快捷又方便。
  • 身份验证器应用程序:可用性中等。需要用户安装应用程序,并且可能涉及更复杂的设置过程。
  • 硬件令牌:可用性中等至低度。需要用户携带额外的设备,这可能很不方便。
  • 生物识别验证:可用性非常高。通常需要快速扫描指纹、面部或眼睛,如果有必要的硬件,它是最用户友好的方法之一。

实施复杂性
  • 基于 SMS 的 2FA:中等复杂性。需要与 Twilio 或 Nexmo 等第三方服务集成。
  • 基于电子邮件的 2FA:低到中等复杂性。利用现有的电子邮件基础设施,通常很容易集成。
  • 推送通知:复杂性高。需要与移动设备管理和第三方消息服务集成。
  • 身份验证器应用程序:中等复杂性。涉及加密操作以及与第三方 TOTP 库的集成。
  • 硬件令牌:高复杂性。需要处理物理设备,并可能需要与安全协议进行自定义集成。
  • 生物识别验证:复杂性高。涉及先进技术以及与生物识别硬件和安全协议的集成。

6. 云中 Java 应用程序安全最佳实践概述
保护云环境中的 Java 应用程序的安全非常重要。随着企业越来越多地将其关键系统迁移到云,强大的安全措施的重要性在任何 Java 应用程序中变得更加明显。本文探讨了保护云中 Java 应用程序安全的最佳实践,重点关注可实施以防范常见威胁的实用策略。

  • 本文深入探讨了保护云环境中 Java 应用程序的基本安全措施。它强调了理解共享责任模型、描述云提供商和客户之间的安全义务的重要性。
  • 云提供商负责保护底层基础设施的安全,而客户则管理其应用程序和数据的安全性。

了解云安全模型
当谈到云安全时,了解共享责任模型至关重要。这个概念是云计算的基础,它描述了云提供商和客户的安全义务。
  • 云提供商的职责:云提供商主要负责保护支持云操作的底层基础设施。这包括运行 Java 应用程序的物理硬件、存储和网络基础设施。提供商确保其数据中心的运营安全,包括但不限于物理安全(场所访问控制、监控等)、环境控制(灭火、气候控制)和网络安全(防止 DDoS 攻击、入侵检测系统)。
  • 客户责任:另一方面,客户(您和我)负责管理您放在云上或连接到云服务的任何内容的安全性。这包括 Java 应用程序本身、它们处理的数据以及它们如何处理访问控制。客户必须管理其云服务的安全配置,其中包括设置防火墙、定义安全组和加密数据。

延伸责任
  • 软件开发生命周期 (SDLC) 中的安全性:在 Java 应用程序的整个软件开发生命周期中纳入安全最佳实践。这涉及使用安全编码实践、执行定期安全测试以及更新应用程序以修补漏洞。
  • 身份和访问管理 (IAM):有效管理谁有权访问云环境中的内容。使用最小权限原则 (PoLP),确保帐户仅拥有其角色所需的权限。
  • 合规性和法律要求:了解并遵守合规性要求,这些要求可能会根据您的行业和您处理的数据类型而有所不同。这包括 GDPR、HIPAA 或 PCI-DSS 等标准,这些标准规定了如何保护数据。

使用安全库和框架还可以显着增强 Java 应用程序的安全性。 OWASP 的 Enterprise Security API (ESAPI) 等库提供了一组强大的安全控制。这些框架已经过安全专业人员的测试和改进,可以针对常见漏洞提供强有力的防御。

具体:
1、一项基本实践是输入验证。正确验证输入对于防止 SQL 注入、跨站点脚本 (XSS) 和命令注入等常见安全威胁至关重要。通过确保仅处理格式正确的数据,您可以阻止许多利用您的应用程序的尝试。例如,在 Java 应用程序中处理用户输入时,您应该始终清理和验证输入,以确保它不包含潜在有害的内容。

2、使用安全库和框架还可以显着增强 Java 应用程序的安全性。 OWASP 的 Enterprise Security API (ESAPI) 等库提供了一组强大的安全控制。这些框架已经过安全专业人员的测试和改进,可以针对常见漏洞提供强有力的防御。

3、安全应用程序开发的另一个重要方面是保持依赖项最新。许多安全漏洞都是由过时的库或框架引起的,攻击者可以利用这些漏洞。定期更新这些依赖项可以弥补安全漏洞并保护您的应用程序。

4、实施彻底的日志记录和监控可以帮助更有效地检测和响应安全事件。日志应捕获有关操作的足够详细信息,尤其是那些可能影响应用程序安全的操作,而不记录敏感的用户数据。监视这些日志可以帮助识别可能表明存在安全漏洞的异常模式。

 5、管理身份验证和授权
身份验证是为了验证用户是谁。这通常涉及用户名和密码,但更强大的系统还使用多重身份验证 (MFA),它将用户知道的信息(如密码)与用户拥有的信息(如智能手机应用程序或硬件令牌)结合起来。

Java应用程序可以使用多种方法集成MFA;一种常见的方法是使用生成基于时间的一次性密码 (TOTP) 的身份验证器应用程序。

import org.jboss.aerogear.security.otp.Totp;
import org.jboss.aerogear.security.otp.api.Base32;

public class MultiFactorAuth {
    private String secret;

    public MultiFactorAuth() {
        this.secret = Base32.random();
    }

    public boolean verify(String userToken) {
        Totp totp = new Totp(this.secret);
        return totp.verify(userToken);
    }
}

该代码通过生成和验证基于时间的一次性密码(TOTP)来实现多因素身份验证(MFA)。MFA 在授予访问权限前要求用户进行两种形式的验证,从而增加了一层安全性,大大降低了未经授权访问的风险。

授权
授权 确保经过身份验证的用户有权执行某些操作。这通常通过定义权限集的角色或组进行管理。例如,与标准用户相比,管理员可能具有不同的权限。在 Java 应用程序中实现基于角色的访问控制 (RBAC) 可以使用 Spring Security 等框架来实现,该框架简化了基于用户角色的应用程序路由和方法的保护。

6、加密静态和传输中的数据
加密在保护敏感信息方面发挥着另一个重要作用,确保数据在存储时和在网络上传输时保持机密性并防止未经授权的访问。

加密传输中的数据
传输中的数据是指主动从一个位置移动到另一个位置的数据——无论是在用户设备和服务器之间还是在服务器本身之间。最佳实践是使用传输层安全性 (TLS) 加密传输中的所有数据。 TLS 在互联网上的两个设备之间提供安全通道。 Java 应用程序可以通过在服务器实例上配置 SSL(安全套接字层)参数来实现 TLS。

静态加密数据
静态数据是指未主动从设备移动到设备或从网络移动到网络的数据。它包括存储在任何设备上的数据,例如数据库、文件系统和存储设备。静态数据加密对于防止物理安全漏洞或未经授权访问时数据泄露至关重要。 Java 提供了多个用于加密静态数据的 API,例如 Java 加密体系结构 (JCA),可轻松将加密集成到应用程序中。

在这两种情况下——无论数据是在传输中还是静态——Java 开发人员都需要了解实现加密的最佳实践。这些实践包括使用强大的加密协议、正确管理加密密钥以及确保加密不会对应用程序的性能或可用性产生负面影响。

此外,遵守法律和监管要求通常需要特定的加密标准。例如,医疗保健应用程序可能需要遵守美国的 HIPAA,该法案对保护患者信息有特定的加密要求。

通过对传输中和静态数据应用加密策略,Java 应用程序可以显着改善其安全状况,保护敏感数据免遭拦截和未经授权的访问。


7. 使用这些顶级设计模式增强您的 Spring Boot 开发能力
本文强调了在 Spring Boot 开发之旅中利用设计模式作为值得信赖的助手的重要性。通过采用这些既定的解决方案,开发人员可以更有效地应对复杂的挑战,简化代码并维护应用程序的平稳运行。

单例模式

  • 目的:确保整个应用程序中仅存在类的单个实例。
  • Spring Boot 的好处:
    • 简化对数据库连接池或配置对象等共享资源的访问。
    • 提高多个组件访问的资源的线程安全性。

工厂方法模式

  • 目的:提供用于创建对象的中央接口,而不向客户端公开创建逻辑。
  • Spring Boot 的好处:
    • 促进组件之间的松散耦合,从而更轻松地切换实现。
    • 启用基于配置或运行时条件的动态对象创建。

存储库模式

  • 目的:将数据访问逻辑(持久层)与业务逻辑分开,以更清晰地分离关注点。
  • Spring Boot 的好处:
    • 通过隔离数据访问逻辑来提高代码的可维护性和可测试性。
    • 促进数据持久性独立性,允许在数据库之间轻松切换。

服务层模式

  • 目的:将业务逻辑封装在专用服务层中,促进模块化和可重用性。
  • Spring Boot 的好处:
    • 改进代码组织和关注点分离,使代码更易于理解和维护。
    • 实现更轻松的服务层测试和跨应用程序的潜在服务重用。

外观模式

  • 目的:为复杂子系统提供简化的接口,隐藏实现细节。
  • Spring Boot 的好处:
    • 通过简化与复杂功能的交互来提高客户端代码的可读性。
    • 通过将客户端与底层子系统实现解耦来促进松耦合。