Dagger2源码浅析

dagger2是目前android端比较火的一款依赖注入框架,先来看下基本的用法吧:
首先提供module,类似于工厂:

@Module
public class ApiServiceModule {
    private static final String ENDPOINT = "";
    @Singleton
    @Provides
    public OkHttpClient providerOkHttpClient(){
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.setConnectTimeout(60 * 1000, TimeUnit.MILLISECONDS);
        okHttpClient.setReadTimeout(60 * 1000, TimeUnit.MILLISECONDS);
        return okHttpClient;
    }
    @Singleton
    @Provides
    public RestAdapter providerRestAdapter(OkHttpClient okHttpClient){
        RestAdapter.Builder builder = new RestAdapter.Builder();
        builder.setClient(new OkClient(okHttpClient))
                .setEndpoint(ENDPOINT);
        return builder.build();
    }
    @Singleton
    @Provides
    public ApiService providerApiService(RestAdapter adapter){
        return adapter.create(ApiService.class);
    }
}

然后是component组件,用来连接module与需求方:

@Singleton
@Component(modules = {AppModule.class , ApiServiceModule.class , AppServiceModule.class})
public interface AppComponent {
    Application getApplication();
    ApiService getService();
    User getUser();
}

在activity中使用:

public class MainActivity extends BaseActivity {

    private TextView tvName;
    @Inject
    MainPresenter mMainPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvName = findViewById(R.id.tvName);
        mMainPresenter.showUserName();
    }

    @Override
    protected void setupActivityComponent(AppComponent appComponent) {
        DaggerMainActivityComponent.builder()
                .appComponent(appComponent)
                .mainActivityModule(new MainActivityModule(this))
                .build().inject(this);
    }

    public void setTextName(String name){
        tvName.setText(name);
    }
}

使用是非常简单的,下面来看一下dagger2是如何做到依赖注入的吧:

首先会调到 DaggerMainActivityComponent.builder(),我们会想到构建者模式,一起看下源码

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

Builder的构造函数中没有做任何处理,接下来看下.build方法:

public MainActivityComponent build() {
      if (mainActivityModule == null) {
        throw new IllegalStateException(
            MainActivityModule.class.getCanonicalName() + " must be set");
      }
      if (appComponent == null) {
        throw new IllegalStateException(AppComponent.class.getCanonicalName() + " must be set");
      }
      return new DaggerMainActivityComponent(this);
    }

new DaggerMainActivityComponent(this) 会初始化component,然后将builder传递进去,这也是建造者模式的一般写法,下面看下其中的构造函数会执行哪些方法呢

  private void initialize(final Builder builder) {
    this.providerMainActivityProvider =
        DoubleCheck.provider(
            MainActivityModule_ProviderMainActivityFactory.create(builder.mainActivityModule));
    this.getUserProvider =
        new com_winning_mvp_dagger2_retrofit_master_di_component_AppComponent_getUser(
            builder.appComponent);
    this.providerMainPresenterProvider =
        DoubleCheck.provider(
            MainActivityModule_ProviderMainPresenterFactory.create(
                builder.mainActivityModule, providerMainActivityProvider, getUserProvider));
  }

下面我们来单独看一下这句

this.providerMainActivityProvider =
    DoubleCheck.provider(
        MainActivityModule_ProviderMainActivityFactory.create(builder.mainActivityModule));

走到MainActivityModule_ProviderMainActivityFactory中看一下:

public final class MainActivityModule_ProviderMainActivityFactory implements Factory<MainActivity> {
  private final MainActivityModule module;

  public MainActivityModule_ProviderMainActivityFactory(MainActivityModule module) {
    this.module = module;
  }

  @Override
  public MainActivity get() {
    return provideInstance(module);
  }

  public static MainActivity provideInstance(MainActivityModule module) {
    return proxyProviderMainActivity(module);
  }

  public static MainActivityModule_ProviderMainActivityFactory create(MainActivityModule module) {
    return new MainActivityModule_ProviderMainActivityFactory(module);
  }

  public static MainActivity proxyProviderMainActivity(MainActivityModule instance) {
    return Preconditions.checkNotNull(
        instance.providerMainActivity(),
        "Cannot return null from a non-@Nullable @Provides method");
  }
}

现在component中的属性都是有值的了,最后看下inject做了哪些操作:

 public static void injectMMainPresenter(MainActivity instance, MainPresenter mMainPresenter) {
    instance.mMainPresenter = mMainPresenter;
  }

到这里依赖注入就已经完成了,这里只是分析了最简单的注入方式。


image
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址Dagger2 入门,以初学者角度 依赖注入 Dagger2是Android中比较热门的依赖注入框架,什么...
    Marlon_IT阅读 1,280评论 1 16
  • 一、首先你要知道什么是依赖? 想要理解Dagger2,首先你要理解一个概念,就是什么是依赖,懂的同学可以省过此段。...
    为梦想战斗阅读 461评论 0 0
  • Dagger2 转载请注明原作者,如果你觉得这篇文章对你有帮助或启发,可以关注打赏。 前言本文翻译自Google ...
    轻云时解被占用了阅读 6,733评论 4 31
  • 《病隙碎笔》是史铁生坐在轮椅上完成的一部,让很多人做出迷茫,建立信心的文章。 为什么这么说? 史铁生的一生是不幸的...
    胥云倩阅读 571评论 0 1
  • 河坊街杭州博物馆城隍阁吴山庙会革命烈士纪念碑万松书院 河坊街 人来人往热闹非凡。其中有一家,老底子的制铜世家,手艺...
    一介山人阅读 297评论 0 1