Dagger2 简单源码理解

1.其他不说只看代码流程

@ActivityScoped
@Component(modules = HomePageModule.class, dependencies = ApplicationComponent.class)
public interface HomePageComponent {

    void inject(MainActivity mainActivity);
}

2.上面定义了一个component 里面声明了 一个module,看看module 里面有什么,先把这些注解忽略不看

@Module
public class HomePageModule {

    private HomePageContract.View view;

    public HomePageModule(HomePageContract.View view) {

        this.view = view;
    }

    @Provides
    @ActivityScoped
    HomePageContract.View provideHomePageContractView() {
        return view;
    }

}

可以看到 component 里面就是写了 inject的接口,

module 里面提供了获取view 的两个方法,这两者应该是通过

这个关联起来了

3.再来看看inject 方法里面的参数 以homepagePresenter 为例

上面有个注解 

百度一下,说跟其他注解没什么不同就是一个自定义注解,有啥用呢?

区分代码层次!可以看到 构造方法上有个inject 注解,可以理解为只有被inject 注解构造方法的类才能使用inject 去实例化。

然后makeproject 编译一下,

 

在这个文件夹下面可以看到dagger2生成的文件。

最后看看整体代码流程

其他的不管只看inject 方法,最终调用MembersInjecter的injectmembers

流程build()

component初始化

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

    this.getContextProvider =
        new Factory<Context>() {
          private final ApplicationComponent applicationComponent = builder.applicationComponent;

          @Override
          public Context get() {
            return Preconditions.checkNotNull(
                applicationComponent.getContext(),
                "Cannot return null from a non-@Nullable component method");
          }
        };

    this.weatherDaoProvider = WeatherDao_Factory.create(getContextProvider);

    this.homePagePresenterMembersInjector =
        HomePagePresenter_MembersInjector.create(weatherDaoProvider);

    this.provideHomePageContractViewProvider =
        DoubleCheck.provider(
            HomePageModule_ProvideHomePageContractViewFactory.create(builder.homePageModule));

    this.homePagePresenterProvider =
        DoubleCheck.provider(
            HomePagePresenter_Factory.create(
                homePagePresenterMembersInjector,
                getContextProvider,
                provideHomePageContractViewProvider));

    this.mainActivityMembersInjector =
        MainActivity_MembersInjector.create(homePagePresenterProvider);
  }

 

MemberInjector 初始化

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

 MemberInjector inject()

@Override
  public void injectMembers(MainActivity instance) {
    if (instance == null) {
      throw new NullPointerException("Cannot inject members into a null reference");
    }
    instance.homePagePresenter = homePagePresenterProvider.get();
  }

可以看出最终是provider 提供的实例,而这一切最终都是在MemberInjector里面初始化的

this.homePagePresenterProvider =
        DoubleCheck.provider(
            HomePagePresenter_Factory.create(
                homePagePresenterMembersInjector,
                getContextProvider,
                provideHomePageContractViewProvider));
public static Factory<HomePagePresenter> create(
      MembersInjector<HomePagePresenter> homePagePresenterMembersInjector,
      Provider<Context> contextProvider,
      Provider<HomePageContract.View> viewProvider) {
    return new HomePagePresenter_Factory(
        homePagePresenterMembersInjector, contextProvider, viewProvider);
  }
@Override
  public HomePagePresenter get() {
    return MembersInjectors.injectMembers(
        homePagePresenterMembersInjector,
        new HomePagePresenter(contextProvider.get(), viewProvider.get()));
  }
public static <T> T injectMembers(MembersInjector<T> membersInjector, T instance) {
    membersInjector.injectMembers(instance);
    return instance;
  }

返回的参数就是 new的HomepagePresenter

总结:1.module 作为provider 的参数的提供者

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值