是否可以同时使用 Dagger 2.0 构造函数注入和单例。
我在文档中找不到答案。
Example:
@Singleton
public class MyClass {
private final OtherClass member;
@Inject
public MyClass(OtherClass member){
this.member = member;
}
}
构造函数注入确实有效。但是如果我在类上写@Singleton,是否可以保证MyClass被创建为单例?
谢谢
Yes.
由于 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);
}
}
}
In initialize(Builder)
,你可以看到一个ScopedProvider
被用作Provider
for MyClass
。当拨打电话时myClass()
方法,将ScopedProvider
's 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)