如何在guice中绑定到CheckedProvider?

vla*_*mir 2 java guice

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

    bind(A.class).toProvider(AProvider.class);
Run Code Online (Sandbox Code Playgroud)

虽然如果我的提供者需要抛出异常,那么CheckedProvider似乎是一个正确的基础接口:

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

    public AProvider implements ConfigCheckedProvider<A> { ... }
Run Code Online (Sandbox Code Playgroud)

但是现在我的一些类需要注入A的实例.这我无法改变.但它看起来像Provider方法不接受CheckedProvider类型.

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

Vla*_*eev 5

按照您的要求,我将发表评论作为答案.


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

@Inject
SomeClass(T t) {  // Won't work
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果你使用普通话就可以了Provider<T>.这是故意做的.当创建对象可能因特定类型的异常而失败时,需要经过检查的提供程序,并且此失败必须由用户代码处理.普通提供商没有这样的功能.

Provider<T>不允许从其get()方法中抛出已检查的异常,并且它抛出的任何未经检查的异常都可能被包装到a中ProvisionException,因此您无法可靠地捕获异常.此外,如果您T直接注入并且您的提供者的get()方法失败,那么您将在注入期间收到错误,这可能导致难以理解的堆栈跟踪(特别是如果您不Injector直接使用s)或甚至他们的缺席.

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

有关我刚才所写内容的更多背景信息,请参阅本手册中的投掷和检查提供商.