Java Guice通用提供程序(提供程序本身是通用的,而不是它绑定到的类)
关于如何使用Guice提供程序绑定到泛型类,如和,有很多在线资源。但是,我很难找到一个关于如何使用通用提供者的资源 例如,假设我有以下内容:Java Guice通用提供程序(提供程序本身是通用的,而不是它绑定到的类),java,inheritance,dependency-injection,guice,constructor-injection,Java,Inheritance,Dependency Injection,Guice,Constructor Injection,关于如何使用Guice提供程序绑定到泛型类,如和,有很多在线资源。但是,我很难找到一个关于如何使用通用提供者的资源 例如,假设我有以下内容: public interface Foo { ... } public class Bar implements Foo { ... } 如您所见,Bar有一个注入参数,该参数必须在构造函数中。在我的情况下,我们不能将此参数移动到字段或方法注入 所以,现在我想为Foo编写一个提供者,但它返回一个Bar实例。大概是这样的: @Single
public interface Foo {
...
}
public class Bar implements Foo {
...
}
如您所见,Bar有一个注入参数,该参数必须在构造函数中。在我的情况下,我们不能将此参数移动到字段或方法注入
所以,现在我想为Foo编写一个提供者,但它返回一个Bar实例。大概是这样的:
@Singleton
public class FooProvider<T extends Foo> extends Provider<Foo> {
@Inject
public FooProvider(Object someParameterWeMustInjectIntoConstructor) {
...
}
...
@Override
public Foo get() {
return new Bar(...);
}
...
}
@Singleton
公共类FooProvider扩展了提供程序{
@注入
public FoopProvider(对象someParameterWeMustInjectIntoConstructor){
...
}
...
@凌驾
公共Foo-get(){
返回新条(…);
}
...
}
请注意,这个类是如何依赖Guice注入本身的单例,因此必须使用.toProvider(FooProvider.class)
配置提供程序。我们也只能使用构造函数注入,而不能使用方法或字段注入,这可能是因为此提供程序具有类型层次结构
我试图找到某种使用.toProvider(FooProvider.class)
的was,但我们都知道这不是有效的Java语法。有人知道我如何使用.toProvider(ClasstoProvider(newtypeliteral(){});
你必须使用reflection它不清楚为什么你必须使用fooproviderextensedprovider
而不是,比如说,FooBarProvider extensedprovider{…return new Bar(…);}
。如果你真的需要这样的东西,你能详细说明为什么需要它吗?我接受的答案就是我想要的:)toProvider
需要一个提供者,而不是TypeLiteral
。无法及时理解链接语法,让我们试试。太棒了!不知道我怎么会错过JavaDoc中的这个。
toProvider(new TypeLiteral<FooProvider<Bar>>() { });