2015-05-20 31 views
3

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

例子:

@Singleton 
public class MyClass { 
    private final OtherClass member; 

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

构造方法注入做的工作是肯定的。但是,如果我在该类上编写@Singleton,是否可以保证MyClass被创建为单例?

谢谢

回答

6

是的。

由于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作为ProviderMyClass 。当调用myClass()法,ScopedProviderget()方法被调用,这是作为一个单执行:

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; 
} 
+0

是的,你说得对。我只查看了我的子组件的生成代码。但在主要组件中,我可以找到ScopedProvider – Soccertrash