如何在 Quarkus 中以编程方式注册 bean?

Posted

技术标签:

【中文标题】如何在 Quarkus 中以编程方式注册 bean?【英文标题】:How to register bean programatically in Quarkus? 【发布时间】:2020-08-12 20:51:03 【问题描述】:

我正在尝试找到一种在 quarkus DI 中以编程方式创建 bean 的方法,但没有成功。在这个框架下可以吗? BeanManager 似乎还没有实现需要的方法。

【问题讨论】:

Quarkus 不支持 CDI 扩展,它的 BeanManager 确实不支持某些东西,要以编程方式注册 bean,您需要编写 Quarkus 扩展。 就像@JanMartiška 所说,您需要编写一个扩展才能做到这一点。基本原因是在 Quarkus 中所有的 bean 解析都是在构建时完成的。 您能否提供更多关于您想要实现的目标的信息?因为通常通过 bean 生产者创建 bean 就足够了。 豆类生产商?你能解释一下吗? docs.jboss.org/weld/reference/3.1.4.Final/en-US/html_single/… 【参考方案1】:

首先,我们应该明确“以编程方式创建 bean” 的确切含义。

但首先,我们应该定义“bean”的含义。在 CDI 中,我们对 bean 的讨论有两种含义:

    组件元数据 - 这个元数据描述了组件属性以及如何创建组件实例; SPI 是javax.enterprise.inject.spi.Bean 组件实例 - 应用程序中使用的真实实例;在规范中,我们称之为“上下文引用”。

元数据通常派生自应用程序类。这样的元数据“由一个类支持”。我所说的“由一个班级支持”是指所有described in the spec。即类 bean、生产者方法和生产者字段。

现在,如果您想以编程方式获取组件实例(选项 2),您可以:

    注入javax.enterprise.inject.Instance;参见例如the Weld docs 使用CDI.current().select(Foo.class).get() 使用 quarkus 特定的Arc.container().instance(Foo.class).get()

但是,如果您想添加/注册一个不受类支持的组件元数据(选项 2),您需要添加一个使用 quarkus 特定 SPI 的扩展,例如作为BeanRegistrar。

【讨论】:

【参考方案2】:

您可以使用实例注入您的 bean:

@Inject
public TestExecutorService(final ManagedExecutor managedExecutor,
                           final Instance<YourTask> YourTask) 
    this.managedExecutor = managedExecutor;
    this.YourTask= YourTask;

如果您需要创建多个实例,您可以使用托管执行器:

tasks.forEach(task -> managedExecutor.submit(task::execute));

请记住,根据您启动 bean 的方式,您可能需要销毁它,并且只有“创建者类”有它的引用,这意味着您必须在同一个类中创建和销毁 bean(您可以使用像处理它的事件)。

更多信息请查看:CDI Documentation

【讨论】:

以上是关于如何在 Quarkus 中以编程方式注册 bean?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 4 中以编程方式注册 UITableViewHeaderFooterView?

如何以编程方式注册 JSF 托管 bean?

可以在加载的 Spring 上下文中以编程方式替换 Spring Bean

在 C# 中以编程方式禁用/注销 Excel UDF

如何在.net 中以编程方式设置连接字符串配置?

如何在IBM WAS中以编程方式启动()/ stop()ear应用程序?