Guice Module绑定使用Injected Class构造的Object

时间:2012-12-20 11:18:44

标签: configuration dependency-injection guice

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

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

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

public class MyClass { 
    OtherClass dependency;

    @Inject
    Public MyClass(OtherClass dependency) {
       ....
    }
}

public class AModule extends AbstractModule {

    protected void configure() {
        MyClass frameworkDependency = ???
        FrameworkClass fc = new FrameworkClass(frameworkDependency);
        bind(FrameworkClass.class).toInstance(fc);
    }
}

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

我的问题是如何在我的模块中访问MyClass的新实例,以便我可以将它提供给框架类?

之前我通过Field Injection注入了我自己的类,所以它看起来像这样:

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作为构造函数注入。

2 个答案:

答案 0 :(得分:2)

如果您使用@Provides方法,就像在答案中一样,每个参数都将通过注入器解析 - 包括使用绑定注释的依赖项,并包括类型Provider<MyClass>的参数而不仅仅是MyClass 。注入Provider是在一个类中检索多个依赖项实例的最佳方法。

@Provides FrameworkClass provideFrameworkClass(
    Dependency1 dep1, Provider<Dependency2> dep2Provider) {
  return new FrameworkClass(dep1, dep2Provider.get(), dep2Provider.get());
}

如果可以通过Guice找到所有绑定,则可以使用toConstructor binding或多或少通过@Inject@Provides外部标记构造函数。请注意,Guice文档实际上更喜欢Provider<FrameworkClass>技术而不是此技术,因为反过来获取构造函数本质上比依赖于编译器更脆弱。但是,如果您有一个长参数列表,这可能是一个不错的选择。

最后,如果你的@Provides方法足够大(或者具有足够复杂的逻辑)来表示它自己的类,你总是可以创建自己的@Inject实现 - 尽可能多地完成bind(FrameworkClass.class).toProvider(FrameworkClassProvider.class)你想要的离子 - 并手动实现创建(通过{{1}}绑定。

答案 1 :(得分:0)

所以我找到了答案我自己的问题(最简单的形式):

通过将Framework Object的配置移动到Provide方法中,我可以将MyClass对象作为参数传递给方法,Guice在该参数的实例化中处理,ala:

@Provides
@Singleton
FrameworkClass provideFrameworkClass(MyClass dependency) {
    return new FrameworkClass(frameworkDependency);
}

但这引出了一个问题,即在更复杂的情况下发生了什么,如果我的框架没有采用单一的依赖,但是其中的n个(比如它是一个采取一系列行动的调度员),我不能只扩展我的provideFrameworkClass方法取n +参数?