写在前面
本文适合接触过,或者已经使用了一段dagger2的小伙伴加深印象,或者想要深入的了解关于dagger2如何进入DI(dependencies inject)过程的一个简单的分析,起到抛砖引玉的作用.
如果你还不知道Dagger2是什么的话,建议去Google 百度 一下.这里就不赘述了,好多好多资料..
重点类
- Provider
- Factory
- MembersInjector
前两个接口其实是一个东西. Factory 继承了 Provider 内部只存在1个方法 get();究其根本,从字面意思上理解就是提供者.它们是泛型借口,get()方法的返回值也同样是该泛型.这里我们可以做一下猜测,它返回的应该是需要注入的类.
MembersInjector 同样也是一个接口,内部也是只有一个方法
injectMembers(T instance) 很直白,直面理解就是成员注入,猜测这个的作用是对于目标累的注入,而T则是目标类.
编译后生成的源码路径结构如下
编译生成的累并不多.
为了防止迷惑.下面讲简单的贴出dagger2的配置过程,如果小伙伴们对这个配置已经很熟悉的话请忽略下面,直接跳到分析原理的过程
AppComponent
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
Context getContext();
}
AppModule
@Module
public class AppModule {
private Application appContext;
public AppModule(App app) {
this.appContext = app;
}
@Provides
@Singleton
public Context provideContext() {
return appContext;
}
}
App
public class App extends Application {
private static App INSTANCE;
@Override
public void onCreate() {
super.onCreate();
INSTANCE = this;
}
public static AppComponent getAppComponent() {
AppComponent appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(INSTANCE))
.build();
return appComponent;
}
}
ActivityComponent