08、Android进阶--Dagger2原理解析

Dagger2原理

我们先写一个简单的例子,创建User、UserModule 和ActivityComponent,代码如下所示:

public class User {
    public String eat(){
        return "吃吃吃";
    }
}

@Module
public class UserModule {
    @Provides
    public User provideUser(){
        return new User();
    }
}

@Component(modules = UserModule.class)
public interface ActivityComponent {
    void inject(MainActivity activity);
}

在MainActivity中使用User,如下所示:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Inject
    User user;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerActivityComponent.create().inject(this);
        String content = user.eat();
        Log.e(TAG, content);
    }
}

这时编译程序会在 build 目录中生成辅助类:

DaggerActivityComponent.java

MainActivity_MembersInjector.java

UserModel_ProvideUserFactory.java

首先从DaggerActivityComponent的代码开始分析,如下所示:

public final class DaggerActivityComponent implements ActivityComponent {
  private final UserModule userModule;

  private DaggerActivityComponent(UserModule userModuleParam) {
    this.userModule = userModuleParam;
  }

  public static Builder builder() {
    return new Builder();
  }
  // 建造者模式
  public static ActivityComponent create() {
    return new Builder().build();
  }

  @Override
  public void inject(MainActivity activity) {
    injectMainActivity(activity);}

  private MainActivity injectMainActivity(MainActivity instance) {
    MainActivity_MembersInjector.injectUser(instance, UserModule_ProvideUserFactory.provideUser(userModule));
    return instance;
  }

  public static final class Builder {
    private UserModule userModule;

    private Builder() {
    }

    public Builder userModule(UserModule userModule) {
      this.userModule = Preconditions.checkNotNull(userModule);
      return this;
    }
	// 创建了UserModule
    public ActivityComponent build() {
      if (userModule == null) {
        this.userModule = new UserModule();
      }
      return new DaggerActivityComponent(userModule);
    }
  }
}

这里主要就是通过建造者模式创建UserModel,并返回当前对象DaggerActivityComponent对象。其中inject方法调用了MainActivity_MembersInjector的injectUser方法,并将Activity的实例和User对象传入,代码如下所示:

public final class MainActivity_MembersInjector implements MembersInjector<MainActivity> {
  private final Provider<User> userProvider;

  public MainActivity_MembersInjector(Provider<User> userProvider) {
    this.userProvider = userProvider;
  }

  public static MembersInjector<MainActivity> create(Provider<User> userProvider) {
    return new MainActivity_MembersInjector(userProvider);}

  @Override
  public void injectMembers(MainActivity instance) {
    injectUser(instance, userProvider.get());
  }
  // 标记
  public static void injectUser(MainActivity instance, User user) {
    instance.user = user;
  }
}

可以看到,这里其实就是将user实例赋值给instance也就是Activity的user引用。此时,就完成了注入的操作。

我们回到上面DaggerActivityComponent的代码中,在UserModel_ProvideUserFactory的provideUser方法代码如下:

public final class UserModel_ProvideUserFactory implements Factory<User> {
  private final UserModel module;

  public UserModel_ProvideUserFactory(UserModel module) {
    this.module = module;
  }

  @Override
  public User get() {
    return provideUser(module);
  }

  public static UserModel_ProvideUserFactory create(UserModel module) {
    return new UserModel_ProvideUserFactory(module);
  }
  // 标记
  public static User provideUser(UserModel instance) {
    return Preconditions.checkNotNull(instance.provideUser(), "Cannot return null from a non-@Nullable @Provides method");
  }
}

这里就是简单的判断实例是否为空,为空则提示方法是否添加@Provides注解。

总结:整个过程就是DaggerActivityComponent通过建造者模式创建UserModule,然后在MainActivity_MembersInjector的inject方法中将user赋值给Activity的user引用。其中,user的实例是通过UserModule_ProvideUserFactory的provideUser方法来创建的。

注意:这里只是针对当前代码的情况,Dagger2在不同情况下源码都会有区别,这里不再详细描述。

原文地址:https://www.cnblogs.com/pengjingya/p/15004608.html