是的。
由于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
为MyClass
。当调用myClass()
法,ScopedProvider
的get()
方法被调用,这是作为一个单执行:
public T get() {
// double-check idiom from EJ2: Item 71
Object result = instance;
if (result == UNINITIALIZED) {
synchronized (this) {
result = instance;
if (result == UNINITIALIZED) {
instance = result = factory.get();
}
}
}
return (T) result;
}
是的,你说得对。我只查看了我的子组件的生成代码。但在主要组件中,我可以找到ScopedProvider – Soccertrash