Dagger 2.0构造函数注入和Singleton

时间:2015-05-20 17:17:06

标签: dependency-injection dagger-2

是否可以一次使用Dagger 2.0构造函数注入和单例。 我在文档中找不到答案。

示例:

@Singleton
public class MyClass {
   private final OtherClass member;

   @Inject
   public MyClass(OtherClass member){
        this.member = member;
   }
 }

构造函数注入确实有效。但是,如果我在课堂上编写@Singleton,是否可以保证MyClass被创建为单身?

谢谢

1 个答案:

答案 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