【发布时间】:2012-09-01 04:56:21
【问题描述】:
我的项目使用 Guice 作为 IOC 容器,负责为大型对象图(主要是单例)提供依赖项(服务类)。有时,如果在构造过程中依赖项失败并且许多对象都需要此依赖项,则失败将一遍又一遍地发生,并将异常添加到 Guice ProvisionException。
我可以理解这种行为的合理性,因为它列出了为节省修复问题而发生的所有错误。但是,我想禁用此功能和“快速失败”,因为在这种情况下重复失败是资源密集型的。此外,“ProvisionException”包含相同异常的列表。
我确实很欣赏这种行为是实现中的不良做法(即资源密集型对象创建)的症状(气味),但由于依赖项是任何人都可以使用依赖注入提供实现和插件的抽象,因此几乎无法防御它。
我想知道的是:-
是否有一个参数可以让 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));
}
}
这个测试资产抛出了两个异常
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) {
}
}
【问题讨论】:
-
你能添加你的具体例子吗?我只是试图分析它,总是只得到发生的第一个配置错误,而不是所有可能错误的列表......
-
后面我会添加一个简单的例子。但是,请注意
ProvisionException是在引导过程中抛出的异常集合的包装异常。所以你只会得到一个ProvisionException,它将一遍又一遍地包含相同的真实异常。 -
我知道对上面的示例进行
bind(IWasDesignedWithHonestIntent.class).to(NastyThrowingExample.class).asEagerSingleton();的编辑只会引发一个异常。但我的问题是 Guice 是否可以选择快速失败以避免将.asEagerSingleton()放在每个可能失败的绑定上,或者我不想要单例对象。 -
@user:290425 我现在发布了一个例子
-
尝试抛出错误而不是异常?
标签: java inversion-of-control ioc-container guice