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

能否注入ArcContainer替代静态方法Arc.container()进行访问?

解决方案:注入ArcContainer替代静态调用

直接注入ArcContainer的方法

完全可以通过@Inject直接注入ArcContainer,这是Quarkus官方支持的方式,无需依赖静态调用:

import io.quarkus.arc.ArcContainer;
import jakarta.inject.Inject;

public class YourService {

    @Inject
    ArcContainer arcContainer;

    public boolean isContextActive() {
        // 检查任意上下文是否激活
        return arcContainer.getContexts().stream()
                .anyMatch(context -> context.isActive());
        // 若需针对特定上下文(如请求上下文),可直接调用:
        // return arcContainer.requestContext().isActive();
    }
}

这样在单元测试中,你可以用Mockito等Mock框架轻松模拟ArcContainer实例,完全避开静态方法模拟的繁琐,测试的可读性和维护性都会提升。

封装辅助Bean的方案

如果想进一步隔离Arc容器的操作逻辑,避免业务代码直接依赖ArcContainer,可以创建专用的辅助Bean:

import io.quarkus.arc.ArcContainer;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

@Singleton
public class ArcContextHelper {

    private final ArcContainer arcContainer;

    @Inject
    public ArcContextHelper(ArcContainer arcContainer) {
        this.arcContainer = arcContainer;
    }

    public boolean isAnyContextActive() {
        return arcContainer.getContexts().stream().anyMatch(context -> context.isActive());
    }

    public boolean isRequestContextActive() {
        return arcContainer.requestContext().isActive();
    }

    // 可根据需求添加更多上下文操作封装方法
}

之后在业务类中注入该辅助Bean即可:

public class YourService {

    @Inject
    ArcContextHelper contextHelper;

    public boolean checkContextStatus() {
        return contextHelper.isRequestContextActive();
    }
}

这种方案能把Arc容器的操作逻辑集中管理,让业务代码更简洁,测试时只需模拟ArcContextHelper或其依赖的ArcContainer即可。

内容的提问来源于stack exchange,提问作者Herr Derb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:52:01