2013-12-19 55 views
5

使用@Singleton而不@Provides:注射类Foo的模块的一个小例子:在匕首

@Module(complete = false, injects = { Foo.class }) 
class MyModule { } 

class Foo { 
    @Inject 
    Foo(Bar bar, Baz baz) { } 
} 

(假设BarBaz由不同的模块中提供)

我现在要Foo是一个单身人士。

我可以添加一个@Provides方法与@Singleton注释它...

@Module(complete = false, injects = { Foo.class }) 
class MyModule { 
    @Provides @Singleton Foo provideFoo(Bar bar, Baz baz) { 
     return new Foo(bar, baz); 
    } 
} 

...但不必编写构造函数调用自己那种违背了使用注射框架的目的。有没有更简单的方法来完成这个?

回答

3

TL;博士

您可以添加到@Singletonclass Foo {}富时通过隐式绑定实例化,它必将为@辛格尔顿。例如:

@Module(complete = false, injects = { Foo.class }) 
class MyModule { } 

@Singleton 
class Foo { 
    @Inject 
    Foo(Bar bar, Baz baz) { } 
} 

范围

这里需要说明的是,如果它是隐式的约束,但没有提到,在一个根曲线图中,扩展图(。再加()生成的图)可能会在无意中实例化它,所以你需要将它声明为一个入口点(injects =)(你在你的例子中做过),或者它需要被入口点可以访问的东西消耗掉。

如果您没有使用.plus()进行范围/生命周期管理,那么最后这一点并不重要。但@Singleton意味着每一个图形,而图形的隐式绑定只能按需实现。即将发布的允许使用自定义作用域批注的功能将捕获这些错误。

+1

啊,我误读了文档 - 我锁定了“作为文档”这个短语,所以我认为@Singleton对于一个类没有任何实际效果,忽略了该部分的第一句。 –

+0

这里对Dagger2有任何更改吗? –