注入类Foo
的模块的一个小示例:
@Module(complete = false, injects = { Foo.class })
class MyModule { }
class Foo {
@Inject
Foo(Bar bar, Baz baz) { }
}
(假设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);
}
}
...但是我必须自己编写那个构造函数调用,这会破坏使用注入框架的目的。有没有更短的方法来实现这一目标?
答案 0 :(得分:3)
您可以将@Singleton
添加到class Foo {}
,当通过隐式绑定实例化Foo时,它将被绑定为@Singleton。例如:
@Module(complete = false, injects = { Foo.class })
class MyModule { }
@Singleton
class Foo {
@Inject
Foo(Bar bar, Baz baz) { }
}
这里需要注意的是,如果在根图中隐式绑定但未引用,则扩展图(.plus()生成的图形)可能会无意中实例化它,因此您需要将其声明为条目 - point(injects =)(你在你的例子中做过),或者它需要被入口点可以达到的东西所消耗。
如果您没有使用.plus()进行作用域/生命周期管理,那么最后一点并不重要。但@Singleton意味着每个图形一个,图形的隐式绑定只能按需实现。即将推出的允许使用自定义范围注释的功能将捕获这些错误。