如何在 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?