Dagger原理直白

还在使用接口解耦吗,为什么有看起来更加简洁的不开始使用尼?
我们项目中使用的目的:
以解耦为目的,避免了大量接口传参进行构造对象。

基于这个目的,我们再去看看他为我们到底做了什么事的。

使用的操作三联
1.@Inject

 public class PhotoNewsFragment extends BaseFragment<IBasePresenter> implements ILoadDataView<List<PhotoInfo>> {

    // 这个这BaseFragment中有使用
    //@Inject
    //protected T mPresenter;

    @Inject
    BaseQuickAdapter mAdapter;

    @Override
    protected void initInjector() {
        DaggerPhotoNewsComponent.builder()
                // 对全局的进行依赖  这里面可能会使用到这个全局的变量             .applicationComponent(getAppComponent())
                .photoNewsModule(new PhotoNewsModule(this))
                .build()
                .inject(this);
    }    
}

2.@module

@Module
public class PhotoNewsModule {

    private final PhotoNewsFragment mView;

    public PhotoNewsModule(PhotoNewsFragment view) {
        this.mView = view;
    }

    @PerFragment
    @Provides
    public BaseQuickAdapter provideAdapter() {
        return new PhotoListAdapter(mView.getContext());
    }
}

3.@Component

@PerFragment
@Component(modules = PhotoNewsModule.class)
public interface PhotoNewsComponent {
    void inject(PhotoNewsFragment fragment);
}

点击make Project 就可以是在第一个class中使用这个adapter了。

简单用会了,那就看看为什么我们能使用了,这个dagger2到底为我们私下做了什么操作。
我们将可以在这里看到它生成的一些列方法

app/build/generated/source/apt/debug/....

二,对应生成

1,@module

public final class PhotoNewsModule_ProvideAdapterFactory implements Factory<BaseQuickAdapter> {
  private final PhotoNewsModule module;

  public PhotoNewsModule_ProvideAdapterFactory(PhotoNewsModule module) {
    assert module != null;
    this.module = module;
  }

  @Override
  public BaseQuickAdapter get() {
    return Preconditions.checkNotNull(
        module.provideAdapter(), "Cannot return null from a non-@Nullable @Provides method");
  }

  public static Factory<BaseQuickAdapter> create(PhotoNewsModule module) {
    return new PhotoNewsModule_ProvideAdapterFactory(module);
  }
}

2,@Component

public final class DaggerPhotoNewsComponent implements PhotoNewsComponent {
  private Provider<IBasePresenter> providePresenterProvider;

  private Provider<BaseQuickAdapter> provideAdapterProvider;

  private MembersInjector<PhotoNewsFragment> photoNewsFragmentMembersInjector;

  private DaggerPhotoNewsComponent(Builder builder) {
    assert builder != null;
    initialize(builder);
  }

  public static Builder builder() {
    return new Builder();
  }

  @SuppressWarnings("unchecked")
  private void initialize(final Builder builder) {

    this.providePresenterProvider =
        DoubleCheck.provider(
            PhotoNewsModule_ProvidePresenterFactory.create(builder.photoNewsModule));

    this.provideAdapterProvider =
        DoubleCheck.provider(PhotoNewsModule_ProvideAdapterFactory.create(builder.photoNewsModule));

    this.photoNewsFragmentMembersInjector =
        PhotoNewsFragment_MembersInjector.create(providePresenterProvider, provideAdapterProvider);
  }

  @Override
  public void inject(PhotoNewsFragment fragment) {
    photoNewsFragmentMembersInjector.injectMembers(fragment);
  }

  public static final class Builder {
    private PhotoNewsModule photoNewsModule;

    private ApplicationComponent applicationComponent;

    private Builder() {}

    public PhotoNewsComponent build() {
      if (photoNewsModule == null) {
        throw new IllegalStateException(PhotoNewsModule.class.getCanonicalName() + " must be set");
      }
      if (applicationComponent == null) {
        throw new IllegalStateException(
            ApplicationComponent.class.getCanonicalName() + " must be set");
      }
      return new DaggerPhotoNewsComponent(this);
    }

    public Builder photoNewsModule(PhotoNewsModule photoNewsModule) {
      this.photoNewsModule = Preconditions.checkNotNull(photoNewsModule);
      return this;
    }

    public Builder applicationComponent(ApplicationComponent applicationComponent) {
      this.applicationComponent = Preconditions.checkNotNull(applicationComponent);
      return this;
    }
  }
}

3,当前Fragment生成的注解类

public final class PhotoNewsFragment_MembersInjector implements MembersInjector<PhotoNewsFragment> {
  private final Provider<IBasePresenter> mPresenterProvider;

  private final Provider<BaseQuickAdapter> mAdapterProvider;

  public PhotoNewsFragment_MembersInjector(
      Provider<IBasePresenter> mPresenterProvider, Provider<BaseQuickAdapter> mAdapterProvider) {
    assert mPresenterProvider != null;
    this.mPresenterProvider = mPresenterProvider;
    assert mAdapterProvider != null;
    this.mAdapterProvider = mAdapterProvider;
  }

  public static MembersInjector<PhotoNewsFragment> create(
      Provider<IBasePresenter> mPresenterProvider, Provider<BaseQuickAdapter> mAdapterProvider) {
    return new PhotoNewsFragment_MembersInjector(mPresenterProvider, mAdapterProvider);
  }

  @Override
  public void injectMembers(PhotoNewsFragment instance) {
    if (instance == null) {
      throw new NullPointerException("Cannot inject members into a null reference");
    }
    com.dl7.mvp.module.base.BaseFragment_MembersInjector.injectMPresenter(
        instance, mPresenterProvider);
        // 这里赋值.....
    instance.mAdapter = mAdapterProvider.get();
  }

  public static void injectMAdapter(
      PhotoNewsFragment instance, Provider<BaseQuickAdapter> mAdapterProvider) {
    instance.mAdapter = mAdapterProvider.get();
  }
}

4,BaseFragment生成的注解类

public final class BaseFragment_MembersInjector<T extends IBasePresenter>
    implements MembersInjector<BaseFragment<T>> {
  private final Provider<T> mPresenterProvider;

  public BaseFragment_MembersInjector(Provider<T> mPresenterProvider) {
    assert mPresenterProvider != null;
    this.mPresenterProvider = mPresenterProvider;
  }

  public static <T extends IBasePresenter> MembersInjector<BaseFragment<T>> create(
      Provider<T> mPresenterProvider) {
    return new BaseFragment_MembersInjector<T>(mPresenterProvider);
  }

  @Override
  public void injectMembers(BaseFragment<T> instance) {
    if (instance == null) {
      throw new NullPointerException("Cannot inject members into a null reference");
    }
    instance.mPresenter = mPresenterProvider.get();
  }

  public static <T extends IBasePresenter> void injectMPresenter(
      BaseFragment<T> instance, Provider<T> mPresenterProvider) {
      // 这里赋值....
    instance.mPresenter = mPresenterProvider.get();
  }
}

简单的几个注解,Dagger为我们生成了大量的代码。
那就开始顺着流程去看看代码。

 DaggerPhotoNewsComponent.builder()
      // 这里是因为我会用到Application 中的一些单例成员变量
                .applicationComponent(getAppComponent())
                .photoNewsModule(new PhotoNewsModule(this))
                .build()
                .inject(this);

这里不会对父类BaseFragment中的@Inject去说明,他比当前类中使用更复杂,还会用到Application中的Module的Provides。

我们看
DaggerPhotoNewsComponent.builder().

—->得到一个静态类 Builder

.photoNewsModule(new PhotoNewsModule(this))

—->静态类 Builder 中PhotoNewsModule 进行赋值
(这里PhotoNewsModule 就是我们自己写的,调用了构造传入了当前This(为一个View))

.build()

—->会执行new DaggerPhotoNewsComponent(this),并会调用初始化方法initialize(builder),在这个初始化方法中,会将Provide 生成的注解类执行
PhotoNewsModule_ProvideAdapterFactory.create(builder.photoNewsModule)方法。(里面传入的photoNewsModule)
也会执行当前Fragment生成注解类的 PhotoNewsFragment_MembersInjector.create(providePresenterProvider, provideAdapterProvider)

.inject(this);

photoNewsFragmentMembersInjector.injectMembers(fragment);
调用到这里 ,我们知道This是当前这个view,对里面的成员变量mAdapter进行了赋值,这个值就是生成的Module生成注解类,里面持有我们自己写的module,自己写的这个提供adapter的构造。

 @Override
  public void injectMembers(PhotoNewsFragment instance) {
    if (instance == null) {
      throw new NullPointerException("Cannot inject members into a null reference");
    }
    com.dl7.mvp.module.base.BaseFragment_MembersInjector.injectMPresenter(
        instance, mPresenterProvider);
    instance.mAdapter = mAdapterProvider.get();
  }

Dagger的目的只是为了解耦进行构造,让代码看起来更加优雅。
当其他方式使用的时候,@Inject 里面持有了View的应用,就可以回调了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值