Guice提供了一种绑定到提供程序的方法:

    bind(A.class).toProvider(AProvider.class);


尽管如果我的提供程序需要引发异常,那么CheckedProvider似乎是正确的基本接口:

    public interface ConfigCheckedProvider<T> extends CheckedProvider<T> {
        T get() throws ConfigException;
    }

    public AProvider implements ConfigCheckedProvider<A> { ... }


但是现在我的某些类需要注入A的实例。而且我不能改变。但看起来toProvider方法不接受CheckedProvider类型。

如何使用基于CheckedProvider的提供程序而不是提供程序注入实例?

最佳答案

根据您的要求,我将发表我的评论作为答案。



如果您有一个类T和一个已检查提供程序TProvider extends CheckedProvider<T>,则不能仅注入T

@Inject
SomeClass(T t) {  // Won't work
    ...
}


就像使用普通Provider<T>一样。这是有意完成的。当对象的创建可能因特定类型的异常而失败时,需要经过检查的提供程序,并且此失败必须由用户代码处理。普通提供程序没有此功能。

Provider<T>不允许从其get()方法中引发检查的异常,并且它引发的所有未检查的异常都可能包装在ProvisionException中,因此您无法可靠地捕获异常。另外,如果直接注入T而提供者的get()方法失败,则注入期间会出现错误,这可能会导致无法理解的堆栈跟踪(尤其是如果您不直接使用Injector的话),甚至是缺席。

受检查的提供程序允许您从提供程序中抛出预先声明的异常类型,并且保证将这些异常按原样传递给在您的受检查的提供程序上调用get()的代码。这样,您可以可靠地捕获它们,但是作为回报,您将失去注入直接由提供程序创建的对象的能力。

有关我刚刚编写的内容的更多背景信息,请参见关于引发和检查提供程序的this manual

09-25 21:44