You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中如何实现Programmatic run-time injection/auto-wiring运行时bean注入

Quarkus运行时Bean字段注入实现方案

Quarkus底层基于兼容CDI标准的Arc容器实现依赖管理,和Spring autowireBean 方法等价的实现逻辑如下:

核心实现步骤

  • 你可以选择两种方式获取CDI容器实例:
    1. 在已经被Quarkus管理的Bean中直接注入ArcContainer实例
    2. 非受管场景下直接调用CDI.current()静态方法获取全局容器实例
  • 运行时构造自定义对象后,调用容器的inject()方法传入该对象,即可完成所有带@Inject、@ConfigProperty等注入注解的字段装配

代码示例

import io.quarkus.arc.ArcContainer;
import jakarta.enterprise.inject.spi.CDI;
import jakarta.inject.Inject;
import jakarta.enterprise.context.ApplicationScoped;

// 受管Bean中使用的场景
@ApplicationScoped
public class YourService {
    // 直接注入Arc容器
    @Inject
    ArcContainer arcContainer;

    public void runtimeCreateBean() {
        // 自行构造的非受管对象
        MyCustomBean customBean = new MyCustomBean();
        // 完成字段自动注入,效果和Spring autowireBean完全一致
        arcContainer.inject(customBean);
        
        // 注意:inject方法仅完成字段注入,不会触发@PostConstruct回调
        // 若需要执行初始化方法,可手动调用,或使用CDI Bean API注册全生命周期受管Bean
    }
}

// 非受管类中使用的场景
public class NonManagedClass {
    public void runtimeCreateBean() {
        MyCustomBean customBean = new MyCustomBean();
        // 静态获取容器完成注入
        CDI.current().inject(customBean);
    }
}

补充说明

如果需要让你运行时构造的对象拥有完整的CDI Bean生命周期(包含@PostConstruct执行、作用域管理、销毁回调等),可以通过Arc提供的BeanConfigurator API在运行时动态注册Bean到容器中,再通过常规依赖注入方式获取实例即可。

内容的提问来源于stack exchange,提问作者Martin Nielsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:57:02