gpt4 book ai didi

java - 有没有办法让 Guice 在 Guice.createInjector 期间快速失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:56 25 4
gpt4 key购买 nike

我的项目正在使用 Guice作为负责为大型对象图(主要是单例)提供依赖项(服务类)的 IOC 容器。有时,如果在构造过程中依赖项失败,并且许多对象都需要此依赖项,则失败将一遍又一遍地发生,并将异常添加到 Guice ProvisionException 中。

我能理解这种行为的合理性,因为它列出了所有发生的错误,以节省修复问题的时间。但是,我想禁用此功能和“快速失败”,因为在这种情况下反复失败是资源密集型的。此外,“ProvisionException”包含相同异常的列表。

我很欣赏这种行为是实现中不良实践(即资源密集型对象创建)的症状(气味),但由于依赖项是抽象的,任何人都可以使用依赖项注入(inject)为其提供实现和插件,因此几乎没有防御措施它。

我想知道的是:-

是否有一个参数可以让 Guice 在第一次出现异常时退出 Injector 创建?

如有任何帮助,我们将不胜感激。

编辑:

@Test
public void guiceExample()
{
Injector injector = Guice.createInjector(new TestModule());
try{
IAmANeedyObject instance = injector.getInstance(IAmANeedyObject.class);
}
catch (ProvisionException e)
{
assertThat(e.getErrorMessages().size(),Is.is(2));
}
}

此测试 Assets 已抛出两个异常

import com.google.inject.AbstractModule;
import com.google.inject.Inject;

public class TestModule extends AbstractModule {

@Override
protected void configure() {
bind(IWasDesignedWithHonestIntent.class).to(NastyThrowingExample.class);
bind(IMindMyOwnBusiness.class).to(SomeLucklessObject.class);
bind(IAlsoMindMyOwnBusiness.class).to(SomeEquallyLucklessObject.class);
bind(IAmANeedyObject.class).to(LowSelfEsteem.class);
}
}

interface IWasDesignedWithHonestIntent {}

interface IMindMyOwnBusiness {}

interface IAlsoMindMyOwnBusiness {}

interface IAmANeedyObject {}

@Singleton
class NastyThrowingExample implements IWasDesignedWithHonestIntent {
@Inject
public NastyThrowingExample() throws LongSlowAgonisingDeathException {
throw new LongSlowAgonisingDeathException("I am dying");
}
}

class LongSlowAgonisingDeathException extends Exception {
@Inject
public LongSlowAgonisingDeathException(String message) {
super(message);
}
}

class SomeLucklessObject implements IMindMyOwnBusiness {
@Inject
public SomeLucklessObject(IWasDesignedWithHonestIntent designedWithHonestIntent) {
}
}

class SomeEquallyLucklessObject implements IAlsoMindMyOwnBusiness {
@Inject
public SomeEquallyLucklessObject(IWasDesignedWithHonestIntent designedWithHonestIntent) {
}
}

class LowSelfEsteem implements IAmANeedyObject {
@Inject
public LowSelfEsteem(IMindMyOwnBusiness iMindMyOwnBusiness, IAlsoMindMyOwnBusiness alsoMindMyOwnBusiness) {
}
}

最佳答案

Is there a parameter that enables Guice to exit Injector creation at the first exception?

恐怕没有,没有。

您将不得不继续使用您的示例中的代码。您可以随时在他们的 Google 代码页上向 Guice 团队提出建议。

关于java - 有没有办法让 Guice 在 Guice.createInjector 期间快速失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12315877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com