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的提供程序注入实例而非提供程序?
按照您的要求,我将发表评论作为答案.
如果您有一个类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()检查提供程序的代码.这样您就可以可靠地捕获它们,但作为回报,您将失去注入由提供程序直接创建的对象的能力.
有关我刚才所写内容的更多背景信息,请参阅本手册中的投掷和检查提供商.