参考实例:
-
Android:dagger2让你爱不释手-基础依赖注入框架篇
-
Mosby中的sample-dagger2-rx
注意点:
- 除了通过@Inject注解过的实例或者setXXX方法能自动给实例赋值外,必须在XXXComponent.java接口中提供对应的获取实例的方法。
- Activity或者Fragment有通过@Inject注解过的实例或者setXXX方法,对应的XXXComponent.java必须提供public void inject(XXXActivity activity)或者public void inject(XXXFragment fragment)接口,这个接口的实现里面会自动给注解的实例赋值。
通过注解实例化的对象都存在DaggerXXXComponent.java中,都是以private Provider<> YYYProvider的实例变量存在。提供实例有三种方式:
- 构造函数前使用@Inject注解,适合自定义的类。
- 通过@Module注解一个类,把需要实例化的对象都在这里面提供一个方法,返回值是需要的类,适合自定义的类和第三方类库。
- XXXComponent.java中提供一个方法,返回值是需要的类,该类必须是构造函数被@Inject注解过或者是 Module中有定义过方法。
知识点:
- enum实现的一个单例工厂
private static enum NoOpMembersInjector implements MembersInjector<Object> {
INSTANCE;
@Override public void injectMembers(Object instance) {
if (instance == null) {
throw new NullPointerException();
}
}
}
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;
}