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。