Dagger2 Simple Source Understanding

1. Others don't just look at the code flow

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

    void inject(MainActivity mainActivity);
}

2. The above defines a component with a module declared inside it. See what's inside the module. Ignore these comments first.

@Module
public class HomePageModule {

    private HomePageContract.View view;

    public HomePageModule(HomePageContract.View view) {

        this.view = view;
    }

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

}

You can see that the component contains the interface where inject is written.

module provides two ways to get a view, which should be done by

This is related

3. Take another look at the parameters in the inject method, for example, homepagePresenter

There is a note above.

Baidu, say that there is no difference with other annotations is a custom annotation, what is the use?

Differentiate code levels!You can seeThere is an inject annotation on the construction method, which means that only classes that are annotated by inject can be instantiated using inject.

Then make project compiles it,

 

Below this folder you can see the files generated by dagger2.

Final look at the overall code flow

The other calls to injectmembers of MembersInjecter, regardless of just looking at the inject method

Process build()

component initialization

@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 initialization

  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();
  }

You can see that the final instance provided by the provider was the one initialized in the EmberInjector

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;
  }

The parameter returned is the new HomepagePresenter

Summary: 1.module as the provider's parameter provider

 

Posted by raptoni on Fri, 17 Jan 2020 08:38:42 -0800