在我在Google Play上发布的所有Android项目中,我总是使用依赖注入Roboguice。最近我能够看到Roboguice 3.0的好处,然后我决定调查Android上的其他库以获取依赖注入,而不是仅使用Roboguice。我是如何找到Dagger,并找到一个有吸引力的概念,LAZY INJECTION,我也读到了Dagger vs. Guice。
答案 0 :(得分:4)
Lazy
只是一个推迟解析绑定的方框。它与Provider
非常相似,只有一个重要的区别:它会缓存第一个调用的值并在后续调用时返回它。
对于单身人士的绑定,从消费者的角度来看,没有任何行为差异。 Lazy<Foo>
和Provider<Foo>
都会懒惰地查找绑定并每次都返回相同的实例。
唯一的行为更改是当你有非单例绑定时。
您可以自己使用Guice实现Lazy
:
public interface Lazy<T> { T get() }
public final class LazyProvider<T> implements Lazy<T> {
private static final Object EMPTY = new Object();
private final Provider<T> provider;
private volatile Object value = EMPTY;
public LazyProvider(Provider<T> provider) {
this.provider = provider;
}
@Override public T get() {
Object value = this.value;
if (value == EMPTY) {
synchronized (this) {
value = this.value;
if (value == EMPTY) {
value = this.value = provider.get();
}
}
}
return (T) value;
}
}
// In your module:
@Provides Lazy<Foo> provideLazyFoo(Provider<Foo> foo) {
return new LazyProvider<Foo>(foo);
}