如何在Quarkus中程序化地注册bean?

问题描述 投票:1回答:1

我试图找到一种方法,如何在Quarkus DI中程序化地创建bean,但没有成功。在这个框架中可以吗?似乎 BeanManager 还没有实现所需的方法。

quarkus
1个回答
0
投票

首先,我们应该明确什么是 "BeanManager"?"程序化地创建bean" 究竟是什么意思。

但首先,我们应该定义什么是 "豆子" 的意思。在CDI中,我们讲的bean有两种含义。

  1. 组件元数据--这个是描述组件属性和如何创建组件实例的;SPI就是 javax.enterprise.inject.spi.Bean
  2. 组件实例--应用中使用的真实实例;在规范中我们称之为 "上下文引用"。

元数据通常来自于应用类。这种元数据是 "由类支持的"。所谓 "由类支持 "是指所有种类的 按规格. 这就是类豆,生产者方法和生产者字段。

现在,如果你想 在程序上获得一个组件实例 (选项2),你可以。

  1. 注入 javax.enterprise.inject.Instance;例如,见 焊缝文件
  2. 利用 CDI.current().select(Foo.class).get()
  3. 利用夸克星专用的 Arc.container().instance(Foo.class).get()

但是,如果你想 添加注册组件元数据 (选项2),你需要添加一个扩展,使用夸克司专用的SPI,例如 BeanRegistrar.


0
投票

你可以使用Instance注入你的Bean。

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

如果你需要创建多个Instance,你可以使用托管执行器。

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

请记住,根据你启动Bean的方式,你可能需要销毁它,只有 "创建者类 "有它的引用,这意味着你必须在同一个classe中创建和销毁Bean(你可以使用类似事件的东西来处理)。

更多信息请查看 CDI文档

© www.soinside.com 2019 - 2024. All rights reserved.