使用Roboguice进行懒人注射

时间:2014-11-19 19:36:07

标签: android code-injection roboguice dagger

在我在Google Play上发布的所有Android项目中,我总是使用依赖注入Roboguice。最近我能够看到Roboguice 3.0的好处,然后我决定调查Android上的其他库以获取依赖注入,而不是仅使用Roboguice。我是如何找到Dagger,并找到一个有吸引力的概念,LAZY INJECTION,我也读到了Dagger vs. Guice

  • Roboguice这个功能还是这样的?
  • 如果没有,限制是因为Roboguice使用反射而Dagger通过预先生成代码来工作?

1 个答案:

答案 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);
}