Configuration 用注入类构造的Guice模块绑定对象

Configuration 用注入类构造的Guice模块绑定对象,configuration,dependency-injection,guice,Configuration,Dependency Injection,Guice,我是Guice的新手,所以如果这是一个愚蠢的问题,请原谅,但我觉得这很令人沮丧 在我的模块中,我构造了一个对象,它是我不控制的框架的成员。然后绑定该实例,以便以后可以使用injector.getInstance(FrameworkClass.class)访问它 当我构造那个对象时,我想使用我自己的一个对象,它本身被注释为由构造函数注入 i、 e 在这个例子中,OtherClass只是一个简单的类,没有注释,但是有一个默认的空构造函数,所以Guice应该创建一个新的构造函数,并将它提供给MyCla

我是Guice的新手,所以如果这是一个愚蠢的问题,请原谅,但我觉得这很令人沮丧

在我的模块中,我构造了一个对象,它是我不控制的框架的成员。然后绑定该实例,以便以后可以使用injector.getInstance(FrameworkClass.class)访问它

当我构造那个对象时,我想使用我自己的一个对象,它本身被注释为由构造函数注入

i、 e

在这个例子中,OtherClass只是一个简单的类,没有注释,但是有一个默认的空构造函数,所以Guice应该创建一个新的构造函数,并将它提供给MyClass构造函数(据我所知)

我的问题是如何在模块中访问MyClass的新实例,以便将其提供给framework类

以前,我通过字段注入来注入我自己的类,所以它看起来像这样:

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());
}