Dagger2是如何保证@singleten单例的

提出问题

  • dagger2是如何保证@singleten单例的?

准备知识

如果你还没有了解过dagger2,不知道component,scope,model,provider,inject。建议你先对dagger2有一个大概的了解。有一些文章我觉得很棒(都提供了具体的项目在github),你可以阅读,并实践一下:

解决问题

基于这个项目讲解

有那些地方使用了@Singleten注解(#代表类的方法)
  • ApplicationComponent
  • AndroidModule#ApplicationContext()
  • AndroidModule#provideLocationManager()
他们之间的关系
Dagger2Demo_@Singleton.png
  • 我们知道Application相当于单例。application中的全局变量的生命周期和application是一致的,例如ApplicationComponent,它的实现类为DaggerApplicationModule(由Dagger2生成,实现了ApplicationComponent接口)。
  • 那些有@Singleton注解(AndroidModule和Inject)的在DaggerApplicationComponent中由DoubleCheck管理,没有任何注解的由Factory管理
  • DoubleCheck和Factory的区别是DoubleCheck会将第一次生成的目标对象缓存下来,以后的调用将直接返回缓存的对象。而Factory每次获取目标对象都是重新生成(调用module中的方法)。
  • Application中保存了DaggerApplicationComponent对象,DaggerApplicationComponent保存了DoubleCheck对象,DoubleCheck对象保存了目标对象(Context或LocationManager)。从而保证了Context和LocationManager在整个App中的单例。

结论

由此可以得出:促使目标对象成为单例的并不是@Singleton注解,而是Application。(它的目的只是为了方便记忆)


我的微信,欢迎一起讨论:

WechatIMG.jpeg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容