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 的参数的提供者