」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 擴展 Quarkus:何時以及如何編寫自己的擴展

擴展 Quarkus:何時以及如何編寫自己的擴展

發佈於2024-11-16
瀏覽:662

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]刪除
最新教學 更多>
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-07-08
  • 如何將PANDAS DataFrame列轉換為DateTime格式並按日期過濾?
    如何將PANDAS DataFrame列轉換為DateTime格式並按日期過濾?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用時間數據時...
    程式設計 發佈於2025-07-08
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-07-08
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-07-08
  • 在GO中構造SQL查詢時,如何安全地加入文本和值?
    在GO中構造SQL查詢時,如何安全地加入文本和值?
    在go中構造文本sql查詢時,在go sql queries 中,在使用conting and contement和contement consem per時,尤其是在使用integer per當per當per時,per per per當per. [&​​​​&&&&&&&&&&&&&&&默元組方...
    程式設計 發佈於2025-07-08
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-07-08
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-07-08
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-07-08
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-07-08
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-07-08
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-07-08
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-07-08
  • 人臉檢測失敗原因及解決方案:Error -215
    人臉檢測失敗原因及解決方案:Error -215
    錯誤處理:解決“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解決此問題,必須確保提供給HAAR CASCADE XML文件的路徑有效。在提供的代碼片段中,級聯分類器裝有硬編碼路徑,這可能對您的系統不准確。相反,OPENCV提...
    程式設計 發佈於2025-07-08
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-07-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3