为了介绍Dagger2的使用,我们搭建了一个Demo来逐步分析,大家可以在
这里下载源码(
这个源码与之前的五个小节源码不同)(https://github.com/dushaofeng/DaggerDemo2.git)。
上一节我们介绍了 《Dagger2教程五之单例模式》,这一节我们来介绍Component的组织方法。
所谓Component组织方法,也就是我们工程中的Component该如何分布和结合。
对于一款APP来说,一些基础的服务类比如全局Log、图片加载器、网络请求器、缓存器等应该做到全局单例,而对某个Activity或者Fragment来说又有自己的单例或者非单例的对象,那么这种情况下该如何组织我们的注入结构呢?
我们现在知道Component是连接注入类和目标类的桥梁,那么最简单的结构应该是这样的:
1、Application负责创建全局的单例或者非单例注入类的Component对象
2、Activity或Fragment在继承Application提供的Component基础上扩展自己的Component接口
那么具体该如何操作呢?
Dagger2给我们提供两种方法来实现注入继承。
1、由于我们设计要将ApplicationBean作为单例注入,因此ApplicationComponent也需要标记@Singleton标识
2、我们在ApplicationComponent中提供了一个返回值为ApplicationBean对象的方法声明, 它的作用是将该Component中的ApplicationBean对象暴露给其他Component使用,相当于AIDL语言中的方法声明。
1、将ApplicationBean注入到Application内部
2、将ApplicationComponent对象共享给Activity或者其他类
具体实现如下:
上一节我们介绍了 《Dagger2教程五之单例模式》,这一节我们来介绍Component的组织方法。
所谓Component组织方法,也就是我们工程中的Component该如何分布和结合。
对于一款APP来说,一些基础的服务类比如全局Log、图片加载器、网络请求器、缓存器等应该做到全局单例,而对某个Activity或者Fragment来说又有自己的单例或者非单例的对象,那么这种情况下该如何组织我们的注入结构呢?
我们现在知道Component是连接注入类和目标类的桥梁,那么最简单的结构应该是这样的:
1、Application负责创建全局的单例或者非单例注入类的Component对象
2、Activity或Fragment在继承Application提供的Component基础上扩展自己的Component接口
那么具体该如何操作呢?
Dagger2给我们提供两种方法来实现注入继承。
一、使用dependencies属性实现继承注入
如果对比源码看的话, 请将源码分支切换到UseDependencies分支。
1.1、准备ApplicationBean对象
我们创建一个ApplicationBean对象用来作为目标类,准备将其注入到应用中: public class ApplicationBean {
private String name = null;
public ApplicationBean() {
name = "AppBean";
}
public String getAppBeanName() {
return name;
}
}
1.2、准备APP级别的Module对象
然后创建ApplicationModule用来将其注入到目标类,并且我们标记了Singleton准备将其作为单例模式注入: @Module
public class ApplicationModule {
//作为单例模式注入app
@Singleton
@Provides
ApplicationBean privoderAppBean() {
return new ApplicationBean();
}
}
1.3、准备APP级别的Component对象
相应的,我们创建ApplicationComponent用来连接ApplicationModule和Application: @Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
void inject(DaggerApplication application);
//说明将BeanForApplication开放给其他Component使用
ApplicationBean providerAppBean();
}
在这里请注意两点:
1、由于我们设计要将ApplicationBean作为单例注入,因此ApplicationComponent也需要标记@Singleton标识
2、我们在ApplicationComponent中提供了一个返回值为ApplicationBean对象的方法声明, 它的作用是将该Component中的ApplicationBean对象暴露给其他Component使用,相当于AIDL语言中的方法声明。
1.4、注入Application
我们需要在Application中完成两个任务:1、将ApplicationBean注入到Application内部
2、将ApplicationComponent对象共享给Activity或者其他类
具体实现如下:
public class DaggerApplication extends Application {
private ApplicationComponent mAppComponent;
@Inject
ApplicationBean mAppBean1;
@Inject