@Provides方法用provide前缀命名
@Module 用Module后缀命名
@Component 以Component作为后缀
Dagger2是通过依赖注入完成类的初始化。
这个过程需要三部分:
#1 依赖提供方(生产者)
#2 依赖注入容器(桥梁)
#3 依赖需求方(消费者)
Component 桥梁
在使用@Component的时候必须要提供scope范围,标准范围是@Singleton
Module 依赖提供方
@Module
#1 @Module 注解类,负责管理依赖。
Module 其实是一个简单工厂模式,Module 里面的方法都是创建相应类实例的方法。
#2 通过@Module获得第三方类库的对象。
#3 @Module是一个依赖提供方的合集。
一些公共的依赖可以放在Component 中
@Component(modules = {ApplicationModule.class, ClientModule.class, GlobalConfigModule.class})
public interface ApplicationComponent {
Application application();
//用于管理网络请求层,以及数据缓存层
IRepositoryManager repositoryManager();
//Rxjava错误处理管理类
RxErrorHandler rxErrorHandler();
OkHttpClient okHttpClient();
//用来存取一些整个App公用的数据,切勿大量存放大容量数据
Map<String, Object> extras();
Gson gson();
}
Component 之间可以通过dependencies依赖
@Component(modules = {LifeFragmentModule.class}, dependencies = {ApplicationComponent.class})
public interface FragmentComponent {
void inject(eFragment Fragment);
}
Inject
主要有两个作用
#1 作为依赖注提供方:
使用@Inject注解构造方法。
注解类的构造函数,让Dagger2帮我们实例化该类,并注入。
#2 作为依赖需求方:
@Provides
#1 注解@Module 类中的方法。
在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。(就是dagger2 可以使用该modele提供的类gson)
@Module
public class AModule {
@Provides
public Gson provideGson(){
return new Gson();
}
//dagger会去查看FragmentModel 是否有提供@Inject的构造方法,没有就会报错
@Provides
LifeFragmentContract.Model provideModule(FragmentModel model) {
return model;
}
}
public class FragmentModel {
@Inject
public LifeFragmentModel( ) {
}
}