Configuration 用注入类构造的Guice模块绑定对象
我是Guice的新手,所以如果这是一个愚蠢的问题,请原谅,但我觉得这很令人沮丧 在我的模块中,我构造了一个对象,它是我不控制的框架的成员。然后绑定该实例,以便以后可以使用injector.getInstance(FrameworkClass.class)访问它 当我构造那个对象时,我想使用我自己的一个对象,它本身被注释为由构造函数注入 i、 e 在这个例子中,OtherClass只是一个简单的类,没有注释,但是有一个默认的空构造函数,所以Guice应该创建一个新的构造函数,并将它提供给MyClass构造函数(据我所知) 我的问题是如何在模块中访问MyClass的新实例,以便将其提供给framework类 以前,我通过字段注入来注入我自己的类,所以它看起来像这样:Configuration 用注入类构造的Guice模块绑定对象,configuration,dependency-injection,guice,Configuration,Dependency Injection,Guice,我是Guice的新手,所以如果这是一个愚蠢的问题,请原谅,但我觉得这很令人沮丧 在我的模块中,我构造了一个对象,它是我不控制的框架的成员。然后绑定该实例,以便以后可以使用injector.getInstance(FrameworkClass.class)访问它 当我构造那个对象时,我想使用我自己的一个对象,它本身被注释为由构造函数注入 i、 e 在这个例子中,OtherClass只是一个简单的类,没有注释,但是有一个默认的空构造函数,所以Guice应该创建一个新的构造函数,并将它提供给MyCla
public class MyClass {
@Inject
OtherClass dependency;
}
public class AModule extends AbstractModule {
protected void configure() {
MyClass frameworkDependency = new MyClass();
requestInjection(frameworkDependency);
FrameworkClass fc = new FrameworkClass(frameworkDependency);
bind(FrameworkClass.class).toInstance(fc);
}
}
如果可能的话,我更愿意将MyClass作为构造函数注入 所以我找到了我自己问题的答案(以最简单的形式): 通过将框架对象的配置移动到提供的方法中,我可以将MyClass对象作为参数传递给该方法,并在该参数的实例化中传递Guice句柄,ala:
@Provides
@Singleton
FrameworkClass provideFrameworkClass(MyClass dependency) {
return new FrameworkClass(frameworkDependency);
}
但这就引出了一个问题,在更复杂的情况下会发生什么,如果我的框架没有采用一个依赖项,而是采用了n个依赖项(假设它是一个执行一系列操作的调度程序),我不能仅仅扩展我的provideFrameworkClass方法以采用n+个参数?如果您使用
@提供的
方法,如您的回答所示,每个参数都将通过注入器解析——包括使用绑定注释的依赖项,还包括Provider
类型的参数,而不仅仅是MyClass。注入Provider
s是在一个类中检索依赖项的多个实例的最佳方法
@Provides FrameworkClass provideFrameworkClass(
Dependency1 dep1, Provider<Dependency2> dep2Provider) {
return new FrameworkClass(dep1, dep2Provider.get(), dep2Provider.get());
}
@提供框架类ProviderFrameWorkClass(
从属关系1 dep1,提供者dep2提供者){
返回新的框架类(dep1,dep2Provider.get(),dep2Provider.get());
}
如果您的所有绑定都可以通过Guice找到,那么您可以或多或少地使用@Inject
在外部标记构造函数。请注意,Guice文档实际上更喜欢@提供的技术而不是这种技术,因为反射式获取构造函数本质上比依赖编译器更脆弱。不过,如果您有一个很长的参数列表,这可能是一个不错的选择
最后,如果@Providers方法足够大(或逻辑足够复杂),可以创建自己的提供程序
——根据需要添加尽可能多的@Inject
离子——并手动实现创建(通过绑定(FrameworkClass.class)绑定)。toProvider(FrameworkClassProvider.class)
@Provides FrameworkClass provideFrameworkClass(
Dependency1 dep1, Provider<Dependency2> dep2Provider) {
return new FrameworkClass(dep1, dep2Provider.get(), dep2Provider.get());
}