登录
首页 >  文章 >  java教程

探索 Quarkus 中的合成豆强大的扩展机制

来源:dev.to

时间:2024-09-03 21:48:53 308浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《探索 Quarkus 中的合成豆强大的扩展机制》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

探索 Quarkus 中的合成豆强大的扩展机制

在 quarkus 的世界中,依赖注入领域丰富且用途广泛,为开发人员提供了多种工具来管理和控制 bean。其中一种工具是合成豆的概念。合成 bean 是一种强大的扩展机制,允许您注册其属性不是从 java 类、方法或字段派生的 bean。相反,合成 bean 的所有属性都由扩展定义。

在本文中,我们将深入了解 quarkus 中的合成豆世界。我们将探讨合成 bean 的需求、它们的实际应用,以及如何在 quarkus 应用程序中创建和使用它们。

了解合成豆

在 quarkus 中,bean 是应用程序的构建块,由上下文和依赖注入 (cdi) 框架管理。通常,cdi bean 是使用各种 cdi 注释(例如 @applicationscoped、@requestscoped 或 @inject)进行注释的 java 类。这些注释
允许 cdi 自动管理 bean 的生命周期和注入。

但是,在某些情况下,您可能需要注册一个不太适合传统 cdi 模型的 bean。这就是合成豆发挥作用的地方。合成 bean 由扩展创建,并且其属性完全由这些扩展定义。在常规 cdi 的世界中,您可以使用 afterbeandiscovery.addbean() 和 syntheticcomponents.addbean() 方法来实现此目的。在 quarkus 中,这是使用 syntheticbeanbuilditem 完成的。

什么时候需要合成豆?

那么,什么时候您可能需要在 quarkus 中使用合成 bean?合成豆在以下情况下是一个强大的工具:

  1. 集成第三方库:您正在使用没有 cdi 注释但需要集成到基于 cdi 的应用程序中的第三方库。合成豆可以帮助您弥补这一差距。

  2. 动态 bean 注册: 您需要在运行时动态注册 bean,具体取决于配置或其他因素。合成 bean 使您可以灵活地动态创建和注册 bean。

  3. 自定义 bean 管理:您需要对 bean 的范围和行为进行细粒度控制,这是标准 cdi 注释无法实现的。

  4. 实现专用 bean:您想要创建具有与传统 java 类或方法不对应的独特属性的专用 bean。

  5. 模拟依赖项以进行测试:合成 bean 提供了一种有用的方法来模拟依赖项并注入模拟实现以进行测试。

综合完成构建项

synthesisfinishedbuilditem 用于指示 cdi bean 发现和注册过程已完成。这允许扩展知道何时可以安全地与已注册的 bean 进行交互。

例如:

@buildstep  
void onsynthesisfinished(synthesisfinishedbuilditem synthesisfinished){
    // cdi bean registration is complete, can now safely interact with beans
    }

syntheticbeansruntimeinitbuilditem

syntheticbeansruntimeinitbuilditem 用于注册一个回调,该回调将在所有合成 bean 初始化后在运行时调用。如果您需要执行涉及合成 bean 的额外初始化逻辑,这非常有用。

例如:

@buildstep
syntheticbeansruntimeinitbuilditem initsyntheticbeans(){

    return new syntheticbeansruntimeinitbuilditem(ids->{
    // perform logic with initialized synthetic beans
    });

    }

传递给syntheticbeansruntimeinitbuilditem的回调将收到一个set<integer>,其中包含所有初始化的合成bean的id。

总而言之,synthesisfinishedbuilditem 表示 bean 发现已完成,而 syntheticbeansruntimeinitbuilditem 允许根据合成 bean 初始化逻辑。

使用 syntheticbeanbuilditem 创建合成 bean

在 quarkus 中,创建合成 bean 是一个简单的过程,这要归功于 syntheticbeanbuilditem 类。让我们逐步完成创建和使用合成 bean 的步骤:

  1. 创建合成 bean 类: 首先定义合成 bean 类。该类将成为您的合成豆的基础。
package com.iqnev;

public class mysyntheticbean {

  // define the behavior and attributes of your synthetic bean
  public void printmessage() {
    system.out.println("hello from synthetic bean!");
  }
}
  1. 创建 quarkus 扩展: 您需要创建 quarkus 扩展来注册您的合成 bean。该扩展类将使用 syntheticbeanbuilditem 来配置您的 bean。

字节码生成方法

package com.iqnev;

import io.quarkus.arc.deployment.syntheticbeanbuilditem;

public class mysyntheticbeanextension {

  @buildstep
  syntheticbeanbuilditem syntheticbean() {
    return syntheticbeanbuilditem
        .configure(mysyntheticbean.class)
        .scope(applicationscoped.class)
        .creator(mc -> {
          mc.returnvalue(new mysyntheticbean());
        })
        .done();
  }
}

syntheticbeanbuilditem 上的 .creator() 方法用于生成字节码,该字节码将在运行时创建合成 bean 的实例。

传递给 .creator() 的参数是 consumer<methodcreator> ,它允许在方法内生成 java 字节码。

在此示例中:

  1. mc 是 methodcreator 实例
  2. mc.returnvalue(new mysyntheticbean()) 生成字节码以创建 mysyntheticbean 的新实例并从方法返回它。

所以本质上,我们告诉 quarkus 生成一个看起来像这样的方法:

mysyntheticbean createsyntheticbean(){
    return new mysyntheticbean();
    }

当需要注入或使用 mysyntheticbean 时,将调用此生成的方法来实例化 mysyntheticbean。

使用字节码生成的原因是合成bean与真正的java类/方法不对应,因此我们必须显式生成一个方法来实例化它们

syntheticbeanbuilditem 的输出是构建时记录的字节码。这限制了在运行时创建实例的方式。常见选项有:

  1. 直接通过.creator()生成字节码
  2. 使用 beancreator 子类
  3. 通过@recorder方法生成实例

录音机方法

@record 和 .runtimevalue() 方法是在 quarkus 中为合成 bean 提供实例的替代方法。

这允许您通过使用@record(static_init)注释的记录器类方法实例化合成bean。

例如:

@recorder
public class myrecorder {

  @record(static_init)
  public mysyntheticbean createbean() {
    return new mysyntheticbean();
  }

}

  @buildstep
  syntheticbeanbuilditem syntheticbean(myrecorder recorder) {
    return syntheticbeanbuilditem
        .configure(mysyntheticbean.class)
        .runtimevalue(recorder.createbean());
  }

这里 .runtimevalue() 引用记录器方法来实例化 bean。这允许直接传递 runtimevalue 来提供合成 bean 实例。

例如:

@buildstep 
syntheticbeanbuilditem syntheticbean(){

    runtimevalue<mysyntheticbean> bean= //...

    return syntheticbeanbuilditem
    .configure(mysyntheticbean.class)
    .runtimevalue(bean);

    }

runtimevalue 可以来自记录器、供应商、代理等。

总结一下:

  • @record 是生成 runtimevalue 的一种方法
  • .runtimevalue() 设置 syntheticbeanbuilditem 上的 runtimevalue

它们都实现了提供运行时实例的相同目标,只是方式略有不同。

当谈到为 quarkus 中的合成 bean 提供运行时实例时,与直接生成字节码相比,我会考虑使用记录器(通过 @record)作为更高级的方法
使用 .creator() 或提供简单的 runtimevalues。

以下是使用录音机可以更高级的一些原因:

  • 更多封装 - 实例化 bean 的逻辑包含在单独的记录器类中,而不是直接包含在构建步骤中。这使得构建步骤变得精简。
  • 重用 - 记录器方法可以在多个合成 bean 之间重用,而不是重写创建者逻辑。
  • 运行时数据 - 记录器方法在运行时执行,因此它们可以利用运行时资源、配置、服务等来构造 bean。
  • 依赖注入 -记录器方法可以注入其他服务。
  • 生命周期控制 - 使用 @record(static_init) 或 @record(runtime_init) 注解的记录器方法可以更好地控制 bean 实例化生命周期。
  • 托管 bean - 在记录器内实例化的 bean 本身可以是 cdi 托管 bean。

总而言之,记录器方法提供了更多的封装性、灵活性以及对运行时数据和服务的访问,以实例化合成 bean。与直接生成字节码相比,它们允许更高级的 bean 生产逻辑。

但是,对于记录器可能过度杀伤的简单情况,使用 .creator() 直接生成字节码仍然有用。但随着合成豆需求的增长,记录仪的功能更加强大
先进的方法。

可以在 quarkus 中配置一个合成 bean 在 runtime_init 阶段而不是默认的 static_init 阶段进行初始化。

这是一个例子:

@buildstep
@record(runtime_init)
syntheticbeanbuilditem lazybean(beanrecorder recorder){

    return syntheticbeanbuilditem
    .configure(mylazybean.class)
    .setruntimeinit() // initialize during runtime_init
    .runtimevalue(recorder.createlazybean());

    }

要点是:

  • 在 syntheticbeanbuilditem 上使用 setruntimeinit() 将其标记为 runtime_init
  • 记录器方法必须使用@record(runtime_init)注解
  • 在 static_init 期间无法访问运行时 init 合成 bean

总而言之,对于不需要急切 static_init 实例化的情况,可以在 runtime_init 期间延迟初始化合成 bean。这可以优化启动时间。

使用合成 bean: 现在您的合成 bean 已注册,您可以在应用程序中注入并使用它。

package com.iqnev;

import javax.inject.Inject;

public class MyBeanUser {

  @Inject
  MySyntheticBean mySyntheticBean;

  public void useSyntheticBean() {
    // Use the synthetic bean in your code
    mySyntheticBean.printMessage();
  }
}

运行您的应用程序:照常构建并运行您的 quarkus 应用程序,合成 bean 将可供注入和使用。

结论

quarkus 中的合成 bean 提供了强大的机制,用于集成外部库、动态注册 bean 以及在基于 cdi 的应用程序中自定义 bean 行为。这些 bean 的属性是由扩展而不是 java 类定义的,在管理依赖项方面提供了灵活性和多功能性。

正如我们在本文中探讨的那样,在 quarkus 中创建和使用合成 bean 是一个简单的过程。通过利用 syntheticbeanbuilditem 和 quarkus 扩展,您可以无缝弥合传统 cdi 与更专业或动态 bean 注册要求之间的差距。

在不断发展的 java 框架领域,quarkus 通过提供合成 bean 等创新解决方案继续脱颖而出,使其成为现代、高效和灵活的应用程序开发的引人注目的选择。拥抱 quarkus 中合成 bean 的强大功能,将您的依赖注入提升到一个新的水平!

本篇关于《探索 Quarkus 中的合成豆强大的扩展机制》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

声明:本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>