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