能否注入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
相关产品推荐
相关产品推荐

