当前位置: 首页 > 图灵资讯 > 技术篇> 探索 Quarkus 中的合成豆强大的扩展机制

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

来源:图灵教育
时间:2024-09-04 20:20:26

探索 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发送的回调将收到一个settimeinitbuilditem。,它包含所有初始化合成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 ,允许在方法内生成 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);

    }
</mysyntheticbean>

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 更多关于图灵教育的其他相关文章,请关注合成豆强大扩展机制的详细内容!