我的Github:https://github.com/BzCoder
本文基于MVPArms进行分析:https://github.com/JessYanCoding/MVPArms
欢迎各位留言讨论
Dagger2算是本框架中学习成本最高的一个框架,很多细节也确实很难在本文章中一言尽之,本文中也就整理本人在组件化开发中对于Dagger2的理解与使用。
Dagger2
Dagger2是一个依赖注入框架,什么是依赖注入?简单通俗的说,将类的初始化通过注入的方式去实现从而降低类与类之间的耦合度。
常用注释以及含义:
注解 | 含义 |
---|---|
@Inject | 注入 |
@Binds | 指定接口的实现 |
@Provides | 提供实例 |
@Named | 类型一致时,需要用Named来指定Inject与Provides 的关系 |
@Singleton | 单例 |
@Component.Builder | Component的构造方法,详细规则见Dagger2源代码注释 |
@BindsInstance | 为变量先提前打桩 |
组件化项目中使用Dagger2
在组件化工程中虽然分为多个模块,但是组件之中还是存在诸多共用组件(网络,缓存,图片加载,生命周期管理,错误管理等),我们保持这些组件的单例,但是同时我们也要保证模块的低耦合性。此时我们就需要灵活使用Dagger2来解决这些问题。
实现方案
设定一个父类AppComponent。然后我们工程中所有Component都要通过dependencies依赖此Component以便所有组件可以使用全局共用组件。一般在业务页面(Fragment,Activity)中可以这样按以下使用。
@xxxxxScope
@Component(modules = xxxxFragmentModule.class, dependencies = AppComponent.class)
public interface xxxxxFragmentComponent {
void inject(xxxxFragment fragment);
@Component.Builder
interface Builder {
@BindsInstance
xxxxtComponent.Builder view(NewsListContract.View view);
xxxxComponent.Builder appComponent(AppComponent appComponent);
xxxxComponent build();
}
}
其中AppComponent关联了三个Module,分别对应了三大块工具。
1.AppModule
AppModule是App基础实例,包含了每个模块都需要的实例以及Application,Activity,Fragment的管理, 其中还包含了我们之前在从零开始Android组件化改造(四) - 模块配置的统一管理中提到的ActivityLifecycle
。除此之外还包含:
- Gson
- Cache
- ActivityLifecycleCallbacks
- FragmentLifecycleCallbacks
- RepositoryManager
2.ClientModule
ClientModule是第三方框架实例,但是与AppModule不同的是,ClientModule的@Provides方法还包含了第三方的框架配置参数信息,这些参数方便在各个模块中对第三方框架进行个性化配置,而这些信息是通过GlobalConfigModule传入的,当然可以根据实际情况增减,现在第三方主要包含了以下:
- OkHttpClient
- Retrofit
- RxCache
- RxErrorHandler
- Interceptor
配置写法如下,其中RxCacheConfiguration中在下面的GlobalConfigModule中取得。
@Singleton
@Provides
static RxCache provideRxCache(Application application, @Nullable RxCacheConfiguration configuration
, @Named("RxCacheDirectory") File cacheDirectory, Gson gson) {
RxCache.Builder builder = new RxCache.Builder();
RxCache rxCache = null;
if (configuration != null) {
rxCache = configuration.configRxCache(application, builder);
}
if (rxCache != null) return rxCache;
return builder
.persistence(cacheDirectory, new GsonSpeaker(gson));
}
3.GlobalConfigModule
GlobalConfigModule是用来注入配置的Module,利用建造者模式+Dagger2构建的一个类,通过从零开始Android组件化改造(四) - 模块配置的统一管理中收集的ConfigModule
将配置收集至此,集中到Dagger2中管理,最终配置到ClientModule中的第三方框架中。详情可以在GlobalConfigModule.java查阅。通过
Mainifest->ConfigModule->GloablConfigModule->ClientModule的路径,最终完成各个模块对于总体工程的配置。
至此我们就介绍完了Dagger2在组件化开发中使用,其中利用Dagger2完成对于不同模块对于APP总体配置的实现思路是非常巧妙的。既保证了单一性也保证了灵活性。
网友评论