Quarkus中如何实现Programmatic run-time injection/auto-wiring运行时bean注入
Quarkus运行时Bean字段注入实现方案
Quarkus底层基于兼容CDI标准的Arc容器实现依赖管理,和Spring autowireBean 方法等价的实现逻辑如下:
核心实现步骤
- 你可以选择两种方式获取CDI容器实例:
- 在已经被Quarkus管理的Bean中直接注入
ArcContainer实例 - 非受管场景下直接调用
CDI.current()静态方法获取全局容器实例
- 在已经被Quarkus管理的Bean中直接注入
- 运行时构造自定义对象后,调用容器的
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
相关产品推荐
相关产品推荐

