需要提前了解Dagger2的
@Singleton
和@Component
依赖。
介绍
Android中的单例模式,可以通过继承Application
类,在onCreate中初始化单例类,然后将单例类的引用通过getXXX()
发布出去。
Application类提供了天然的单例模式。
但是,如果我们有10个单例类,那么就需要
- 在
Application
类里面写10个引用, - 10个
getXXX()
方法 onCreate()
中10个单例类的初始化
缺点
- 当需求变动,要更换实现类的时候,要在Application里面做修改
onCreate()
中初始化的10个单例类,并不是马上就要用的,更好的做法是,要用到他们的时候才实例化他们,但是在onCreate()
中实例化,则必须将10个类一次性提前全部实例化。
用Dagger2解决上述两个缺点
- 依赖Dagger2
- 将10个单例类从Application类中移除
- 创建
ApplicationComponent
类,并用@Component
和@Singleton
标注,在ApplicationComponent
中写带返回值的方法(用于别的Component类来依赖,或者自己要用的时候调用),不写void inject(上下文)
方法,因为不需要在onCreate
中立刻实例化那10个单例类。 - 创建
ApplicationModule
类,标注@Module
,写好工厂方法并标注@Provides
和@Singleton
,回到ApplicationComponent
,加上这个ApplicationModule.class
。 - 在
onCreate
中实例化ApplicationComponent
,并用getApplicationComponent()
,将该component
对象发布出去。
那么这个时候,在别处任何地方通过该ApplicationComponent
对象来依赖注入的任何对象,都是单例的。
而且别的Component
还可以依赖ApplicationComponent
来拓展自己的依赖注入范围,且通过拓展而来的那些依赖注入来的对象,依然是单例的。
好处:
- 大大缩减了
Application
类的代码量。 - 当后期需求变动,要改单例类的实现时,只要改
ApplicationModule
中的工厂方法即可。