是否可以一次使用Dagger 2.0构造函数注入和单例。 我在文档中找不到答案。
示例:
@Singleton
public class MyClass {
private final OtherClass member;
@Inject
public MyClass(OtherClass member){
this.member = member;
}
}
构造函数注入确实有效。但是,如果我在课堂上编写@Singleton,是否可以保证MyClass被创建为单身?
谢谢
答案 0 :(得分:9)
是
由于Dagger 2为您生成源代码,因此很容易检查发生了什么。例如,将以下模块与MyClass
:
@Component
@Singleton
public interface MyComponent {
MyClass myClass();
}
生成以下实现:
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerMyComponent implements MyComponent {
private Provider<MyClass> myClassProvider;
private DaggerMyComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
public static MyComponent create() {
return builder().build();
}
private void initialize(final Builder builder) {
this.myClassProvider = ScopedProvider.create(MyClass_Factory.create(OtherClass_Factory.create()));
}
@Override
public MyClass myClass() {
return myClassProvider.get();
}
public static final class Builder {
private Builder() {
}
public MyComponent build() {
return new DaggerMyComponent(this);
}
}
}
在initialize(Builder)
中,您可以看到ScopedProvider
用作Provider
的{{1}}。调用MyClass
方法时,会调用myClass()
的{{1}}方法,该方法以单例形式实现:
ScopedProvider