Dagger的好处:
使用Dagger2 的好处比较明显的就是,可以方便的修改,构建对象。 比如很多对象的构建都需要Context,你只要有一个可以提供Context的moudule就可以了,还可以比较方便的控制对象的生命周期,简单来讲就是可以很方便的构建和修改对象的构造函数(只需要维护好Component,module,当然这些对于新手并不简单)。

Dagger的缺点:
1.移动类到不同的包下,或者重命名某个类之后,需要执行以下步骤:

Build-->Clean Project-->Make Project-->run

如果改动了XComponent类,则要记得在Make Project之后加上最新的DaggerXComponent.create().inject()代码。

2.类的初始化变得隐晦而呆板,比如要使用动态的参数来初始化某个类,比如:

StudentData data = new StudentData(name, sex, age);

上述name, sex, age是动态变化的,此时Dagger就显得手足无措了,或者Dagger的初衷本来就不是应付动态参数实例化的,如果有朋友发现Dagger能轻松应付这种场景的方法,还请多多指教。
3.Module功能局限性太大。在Module里,用@Provide标注的实例化入口,返回类型不能雷同,比如:

@Provides
String provideName() {return "张三";
}@Provides
String provideAddress() {return "广东省深圳市";
}

这样写编译是不能通过的,因为你有两个@Provides标注的方法均返回了String这个类型,那么你在其他类Inject的时候,Dagger不知道你想要拿哪一个String,当然,你可以通过增加@Named来区分,这样一来,你在Activity中使用的时候,变量也要加上相应的@Named注解,并指明对应的值,你的注解越来越多。

4.类的急剧增加,维护成本增加。比如,有一个类AppConfigure,它的构造函数不能直接拿到,因为这个类是jar包里提供的,其全局唯一,要在MainActivity里使用,传统的写法,可能是这样的:
① 新建一个单例类,维护这个AppConfigure。
② 在MainActivity里初始化并使用该单例类。
以上,一共才新建了两个类,直接Run就行,简单明了。
但是如果使用Dagger,你可能要这样做:
① 新建一个Module,里面有一个@Provide标注的方法来产生AppConfigure,根据是不是单例增加相应的注解。
② 新建一个Component,用来关联MainActivity和Module
③ Make Project,产生相应的DaggerComponent类
④ 在MainActivity的onCreate()方法里调用DaggerComponent的方法完成注入
以上是最简单的Dagger使用流程,这样就凭空多了一个Component类。如果你使用的是谷歌官方DaggerAndroid规范,则步骤更多:

Application --> AppComponent --> MainActivityModule --> MainActivitySubComponent --> MainActivitySubModule --> AppConfigure, 其他实体...↑MainActivity--> XXXXActivityModule --> XXXXActivitySubComponent --> XXXXActivitySubModule ...↑XXXXActivity

看到这些,我只想说,丢雷楼某。
5.各种注解相互混搭,可读性极差。我们都知道,注解的使用会让代码显得简洁,但同时忽略了很多细节,特别是对于刚接手别人项目的新同事,瞬间懵逼,这东西到底是干嘛用的。

6.各种小坑,比如注解不能应用在private修饰的变量上,@Provides只能标注public的方法等,编译错误信息太笼统,查找出错的地方相当困难。

7.稍微总结一下吧。有人说,假设有一个3000行的构造方法,参数的类型和个数在版本迭代的时候会经常发生更改,使用Dagger的话,只需要在Module里修改就可以了。但其实我们冷静地想一下,这种“更改”不也是“固定”的吗?因为你更改的那些参数,使用的值都是固定的,那我用一个单例不也一样能搞定吗?有人说,如果要在多个地方使用不同的实例呢?那我一样可以使用建造者模式来实现啊。所以说,不要为了框架的存在而强行使用框架,而要为了项目的整体效率而考虑框架。

注意事项:
注意:
1.假设在XActivity中Inject某个类A,那么在类A中则也拥有XActivity的实例,这个实例是相同的。要想得到这个实例,只需在类A的@Inject标记的构造方法的参数里加上即可,例如:

public class A {@Injectpublic A(XActivity activity) {...}
}

2.在普通的类里,构造函数先被执行完毕,@Inject标记的成员才开始实例化

3.成员初始化的顺序和变量@Inject的顺序有关,比如:

public class XActivity {@InjectStudent student;@InjectMainPresenter mainPresenter;...
}

那么student会比mainPresenter先完成实例化。

Dagger从入门到放弃相关推荐

  1. Android -- 带你从源码角度领悟Dagger2入门到放弃(一)

    1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...

  2. AI从入门到放弃2:CNN的导火索,用MLP做图像分类识别?

    来源 | 腾讯知乎专栏 作者 | AIoys(腾讯员工,后台工程师) 项目文档和代码在此:github项目地址: https://github.com/zsysuper/AI_Notes ▌一.前言 ...

  3. AOP埋点从入门到放弃(二)

    其实人最大悲哀莫过于知道自己想要什么,却不知道怎么坚持!最近迷恋上了死侍 其实和我平时的状态差不多,以一个混子的心态去做任何事情,往往成功的概率会更大!!! 一张图片镇楼!!! 上文说到了Aspect ...

  4. 入门到放弃node系列之网络模块(二)

    为什么80%的码农都做不了架构师?>>>    前言 本文首发[一名打字员] 上一节我们刚刚介绍完node的HTTP和HTTPS模块,相信我们也对nodejs有了更深层次的理解,接下 ...

  5. webpack - vue Component 从入门到放弃(三)

    离上一篇已经一个星期了,人的拖延症是没法救的,今晚趁着蒙蒙春雨,来抒发抒发情感. 上一篇简单介绍了webpack的配置,这里稍微再做一一下延伸 插件 插件可以完成更多 loader 不能完成的功能.插 ...

  6. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  7. python ** 运算符_Python从入门到放弃运算符(2)

    摘要:上一篇Python从入门到放弃-运算符(1),讲了Python的运算符中的算术运算符.赋值运算符.比较(关系)运算符,这篇继续讲Python的运算符. 逻辑运算符 逻辑运算符是对真和假两种布尔值 ...

  8. python从入门到放弃系列恶搞短片-太惨!学Python方法用错,直接从入门到放弃!...

    原标题:太惨!学Python方法用错,直接从入门到放弃! 从你开始学习编程的那一刻起,就注定了以后所要走的路-从编程学习者开始,依次经历实习生.程序员.软件工程师.架构师.CTO等职位的磨砺:当你站在 ...

  9. 为什么叫python编程-月薪上万的Python编程,为什么你还没入门就放弃了?

    "大家都是怎么学Python 的?我学了一个月,感觉自己怎么学都学不进去啊,还是一脸懵--学习前我有做过规划,现在连入门都不算,我应该怎么办啊!!!求大神给一个学习思路!求大神讲解入门要重点 ...

最新文章

  1. Siege的线程模型-基于版本2.56
  2. tail -f 不断刷新
  3. python学习笔记(十)标准库pprint
  4. 29岁博士获聘教授具有导向意义
  5. 不要用偏执毁掉一个产业
  6. 无连接可靠传输_这些RF连接器设计原则你应该多了解一下
  7. 用python编写密码安全性_密码安全性
  8. android LocalActivityManager说明
  9. 以上是对图像的椒盐噪声处理,在p_temp[j*wide+i]=0;这句程序中为什么要乘以wide,求解,谢谢!
  10. 加动画喽。。有一次我设定动画的时间不管用。就把设置时间的代码位置调整到最开始。然后就好了。...
  11. 王传福:电动汽车开始由政策与市场双轮驱动|电动车百人会2019
  12. ADB工具包下载及安装
  13. 风格迁移篇--CCPL:Contrastive Coherence Preserving Loss for Versatile Style Transfer多功能风格转换的对比连贯保持损失
  14. python使用matplotlib超全画图
  15. 中国近代史导图(二)
  16. 20210327-第一次java笔记
  17. stm32c8t6+dht11+MQ系列环境检测模块+oled显示屏(基于物联网的家庭环境检测系统设计)
  18. Swift5代码添加约束
  19. PLSQL-Developer工具
  20. 在C++中 :: 的三种意思

热门文章

  1. 基于python的影评数据分析_[Python] 通过采集两万条数据,对《无名之辈》影评分析...
  2. 怎样打开计算机音频服务器,win7系统音频服务器怎么启动 win7电脑音频服务未启动解决方法...
  3. 阿里云如何解析域名,阿里云域名解析教程
  4. 西门子精智触摸屏故障问题处理汇总(黑屏+白屏+花屏等)
  5. “品美酒,写骚码”之白酒篇
  6. 无法定位程序输入点kernel32.dll,如何修复kernel32.dll
  7. java根据两个时间段来获取所处季度
  8. 微信小程序 设置cookie-保持会话持久-免登录
  9. Nvidia Tesla A100显卡驱动安装下载(Linux)
  10. 此应用专为旧版本鸿蒙,尴尬!鸿蒙OS遭软件误判断Android模拟器,更多应用深度适配中...