Chr*_*tin 5 dependency-injection dagger
注入类的模块的一个小例子Foo:
@Module(complete = false, injects = { Foo.class })
class MyModule { }
class Foo {
@Inject
Foo(Bar bar, Baz baz) { }
}
Run Code Online (Sandbox Code Playgroud)
(假设Bar和Baz由不同的模块中提供)
我现在想Foo成为一个单身人士.
我可以添加一个@Provides方法并用@Singleton... 注释它
@Module(complete = false, injects = { Foo.class })
class MyModule {
@Provides @Singleton Foo provideFoo(Bar bar, Baz baz) {
return new Foo(bar, baz);
}
}
Run Code Online (Sandbox Code Playgroud)
...但是我必须自己编写构造函数调用,这会破坏使用注入框架的目的.有没有更短的方法来实现这一目标?
您可以添加@Singleton,class Foo {}当通过隐式绑定实例化 Foo 时,它将被绑定为@Singleton。例如:
@Module(complete = false, injects = { Foo.class })
class MyModule { }
@Singleton
class Foo {
@Inject
Foo(Bar bar, Baz baz) { }
}
Run Code Online (Sandbox Code Playgroud)
这里需要注意的是,如果它在根图中隐式绑定但未引用,则扩展图(.plus() 生成的图)可能会无意中实例化它,因此您需要将其声明为入口点(注入=)(您在示例中所做的),或者它需要被入口点可到达的内容所消耗。
如果您不使用 .plus() 进行范围/生命周期管理,那么最后一点并不那么重要。但 @Singleton 意味着每个图一个,并且图的隐式绑定只能按需实现。即将推出的允许使用自定义范围注释的功能将捕获这些错误。
| 归档时间: |
|
| 查看次数: |
1625 次 |
| 最近记录: |