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

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

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

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]删除
最新教程 更多>
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-07-03
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-07-03
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
    编程 发布于2025-07-03
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-07-03
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-07-03
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-07-03
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-07-03
  • Go语言如何动态发现导出包类型?
    Go语言如何动态发现导出包类型?
    与反射软件包中的有限类型的发现能力相反,本文探索了替代方法,探索了在Runruntime。go import( “ FMT” “去/进口商” ) func main(){ pkg,err:= incorter.default()。导入(“ time”) 如果err...
    编程 发布于2025-07-03
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-07-03
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-07-03
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-07-03
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-07-03
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-07-03
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-07-03
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-07-03

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

Copyright© 2022 湘ICP备2022001581号-3