”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 扩展 Quarkus:何时以及如何编写自己的扩展

扩展 Quarkus:何时以及如何编写自己的扩展

发布于2024-11-16
浏览:743

Extending Quarkus: When and How to Write Your Own Extensions

Quarkus 凭借其创新的扩展框架,为开发人员提供了一种将各种技术无缝集成到其应用程序中的强大方法。这些扩展简化了配置、启用依赖项注入并优化了性能,使其成为 Java 开发人员的一个有吸引力的选择。然而,在深入创建您自己的 Quarkus 扩展之前,了解何时需要以及如何有效地做到这一点至关重要。

何时创建 Quarkus 扩展

  1. 复杂集成: 如果您正在使用 ORM 映射器、响应式客户端或数据访问库等复杂框架,那么创建扩展可以帮助管理复杂的配置和依赖项管理。扩展简化了 Quarkus 应用程序中这些框架的使用。

  2. 性能优化: Quarkus 扩展旨在与 Quarkus 的本机编译保持一致,从而使应用程序能够快速启动并具有最小的内存占用。通过创建扩展,您可以利用 Quarkus 的构建时优化能力来扫描依赖项并尽早生成配置,从而避免启动延迟。

  3. 开发者体验增强:扩展可以显着增强开发者体验。它们支持实时重新加载、CLI 扩展、模板化等,从而简化了开发过程。如果您想为您的团队提供无缝且高效的开发环境,扩展可以帮助实现这一目标。

  4. API 强化: 如果您正在构建供其他 Quarkus 开发人员使用的 API 或库,扩展提供了一种绝佳的方法来强化您的 API 并确保它们在 Quarkus 生态系统中无缝工作.

但是,扩展可能并不总是最好的方法。对于更简单的需求,例如在组件之间共享实用程序代码和粘合逻辑,基本的 JAR 文件可能就足够了,而无需创建扩展的开销。如果您的集成是特定于应用程序的并且不太可能在其他地方重用,则基本 JAR 可能是更简单的解决方案。此外,如果您需要完全控制依赖项版本,并且不想遵守 Quarkus 的 BOM(物料清单)进行依赖项管理,那么 JAR 可能是更好的选择。最后,如果您的代码需要跨多个 JVM 框架工作,例如 SpringMicronaut,最好避免与 Quarkus 紧密耦合。

创建 Quarkus 扩展可能很复杂,通常需要深入了解 Quarkus 内部工作原理。然而,对于许多场景,创建标准 JAR 就足够了。当 Jandex 索引此 JAR 时,Quarkus 可以在构建期间无缝地发现该 JAR。虽然 Quarkus 扩展提供了一系列优势,包括卓越的性能和开发人员生产力,但它们可能并不总是必要的。

Quarkus 将工作转移到构建时间而不是运行时的独特方法是其快速启动时间和低内存占用的核心。这一理念延伸到了 Quarkus 扩展,它可以利用这些构建时优化。即使您主要关心的不是快速启动时间,创建扩展的好处还包括简化配置、扩展 Quarkus CLI 以及与 Quarkus 的开发模式集成。

创建 Quarkus 扩展不必过于复杂。通过正确的方法和对项目需求的清晰了解,您可以有效地解决复杂的问题。扩展提供了一种灵活而强大的方式来增强您的 Quarkus 应用程序并使其更加高效且对开发人员友好。

创建 Quarkus 扩展

当您确定创建 Quarkus 扩展是正确的方法时,了解扩展的结构组件至关重要:

  • 运行时部分: 该部分包含作为 bean、服务或与 Quarkus 集成的其他组件实现的核心业务逻辑;
  • 部署部分:部署部分处理构建时的增强和配置。它确保您的扩展与 Quarkus 的优化流程无缝集成;
  • 描述符: 描述符声明有关您的扩展的元数据,包括其名称、参数、兼容性信息等;
  • 文档: 综合文档应随您的扩展一起提供。它指导用户如何有效地使用和配置您的扩展。

Quarkus 扩展的解剖

考虑一个场景,您想要为 Quarkus 创建自定义缓存扩展。此扩展将使开发人员能够轻松地将缓存功能集成到他们的 Quarkus 应用程序中。

  1. 运行时部分:

    • 在本节中,您将使用 Java 代码实现核心缓存功能。这可能包括缓存数据、检索缓存数据和管理缓存过期的方法。
    • 例如,您可能有一个 CustomCacheService 类,其中包含 put(key, value)、get(key) 和 evict(key) 等方法来处理缓存操作。
  2. 部署部分:

    • 部署部分负责构建时优化。在这里,您可以指定在构建过程中如何生成缓存配置。
    • 对于我们的缓存扩展,本节可能包括有关如何扫描应用程序代码中的缓存对象并生成缓存配置的说明。
  3. 描述符:

    • 描述符文件 (custom-cache-extension.yaml) 提供有关您的扩展的元数据。它包括扩展名称、版本、与 Quarkus 的兼容性以及配置参数等信息。
    • 例如,您的描述符可能指定扩展名为“custom-cache-extension”,与 Quarkus 2.0 兼容,并且需要缓存超时配置参数。
  4. 文档:

    • 您的扩展应附带全面的文档。它指导用户如何在 Quarkus 应用程序中有效地使用自定义缓存扩展。
    • 文档应包括如何配置缓存、将其集成到 Quarkus 服务以及管理缓存数据的示例。此外,它应该提供缓存利用的最佳实践。

通过遵循此结构,您的自定义缓存扩展将成为 Quarkus 开发人员的宝贵工具。他们可以轻松地将缓存合并到应用程序中,从而提高性能并优化资源使用。

运行时模块:

class CustomCacheService {

    // Core caching functionality using Java code
    public void put(String key, Object value) {
      // Cache data implementation
    }

    public Object get(String key) {
      // Retrieve cached data implementation
    }

    public void evict(String key) {
      // Evict cached data implementation
    }
}

部署模块:

class CustomCacheProcessor {
    @BuildStep
    FeatureBuildItem feature() {
        // This declares the custom cache extension as a feature
        return new FeatureBuildItem("custom-cache");
    }
}

描述符文件: custom-cache-extension.yaml

extension:
name: custom-cache-extension
metadata:
    short-name: "resteasy-reactive"
    keywords:
    - "jaxrs"
    - "web"
    - "rest"
    categories:
    - "web"
    - "reactive"
    status: "stable"
    guide: "https://quarkus.io/guides/resteasy-reactive"

结论

总之,是否创建 Quarkus 扩展取决于您项目的具体需求和目标。 Quarkus 扩展是用于深度集成、性能优化和增强开发人员体验的强大工具。然而,权衡利弊并考虑更简单的解决方案(例如标准 JAR 库)是否更适合您的用例至关重要。通过了解何时以及如何有效地创建 Quarkus 扩展,您可以做出明智的决策并充分利用这一创新框架的潜力。

版本声明 本文转载于:https://dev.to/yanev/extending-quarkus-when-and-how-to-write-your-own-extensions-1a0k?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-07-03
  • Java中Lambda表达式为何需要“final”或“有效final”变量?
    Java中Lambda表达式为何需要“final”或“有效final”变量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    编程 发布于2025-07-03
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-07-03
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-07-03
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-07-03
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-07-03
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-07-03
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-07-03
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-07-03
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 在使用Chrome and IE9中的图像时遇到的一个频繁的问题是围绕图像的持续薄薄边框,尽管指定了图像,尽管指定了;和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下...
    编程 发布于2025-07-03
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-07-03
  • 编译器报错“usr/bin/ld: cannot find -l”解决方法
    编译器报错“usr/bin/ld: cannot find -l”解决方法
    错误:“ usr/bin/ld:找不到-l “ 此错误表明链接器在链接您的可执行文件时无法找到指定的库。为了解决此问题,我们将深入研究如何指定库路径并将链接引导到正确位置的详细信息。添加库搜索路径的一个可能的原因是,此错误是您的makefile中缺少库搜索路径。要解决它,您可以在链接器命令中添加...
    编程 发布于2025-07-03
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-07-03
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-07-03
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-07-03

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3