Dagger从入门到放弃
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从入门到放弃相关推荐
- Android -- 带你从源码角度领悟Dagger2入门到放弃(一)
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
- AI从入门到放弃2:CNN的导火索,用MLP做图像分类识别?
来源 | 腾讯知乎专栏 作者 | AIoys(腾讯员工,后台工程师) 项目文档和代码在此:github项目地址: https://github.com/zsysuper/AI_Notes ▌一.前言 ...
- AOP埋点从入门到放弃(二)
其实人最大悲哀莫过于知道自己想要什么,却不知道怎么坚持!最近迷恋上了死侍 其实和我平时的状态差不多,以一个混子的心态去做任何事情,往往成功的概率会更大!!! 一张图片镇楼!!! 上文说到了Aspect ...
- 入门到放弃node系列之网络模块(二)
为什么80%的码农都做不了架构师?>>> 前言 本文首发[一名打字员] 上一节我们刚刚介绍完node的HTTP和HTTPS模块,相信我们也对nodejs有了更深层次的理解,接下 ...
- webpack - vue Component 从入门到放弃(三)
离上一篇已经一个星期了,人的拖延症是没法救的,今晚趁着蒙蒙春雨,来抒发抒发情感. 上一篇简单介绍了webpack的配置,这里稍微再做一一下延伸 插件 插件可以完成更多 loader 不能完成的功能.插 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- python ** 运算符_Python从入门到放弃运算符(2)
摘要:上一篇Python从入门到放弃-运算符(1),讲了Python的运算符中的算术运算符.赋值运算符.比较(关系)运算符,这篇继续讲Python的运算符. 逻辑运算符 逻辑运算符是对真和假两种布尔值 ...
- python从入门到放弃系列恶搞短片-太惨!学Python方法用错,直接从入门到放弃!...
原标题:太惨!学Python方法用错,直接从入门到放弃! 从你开始学习编程的那一刻起,就注定了以后所要走的路-从编程学习者开始,依次经历实习生.程序员.软件工程师.架构师.CTO等职位的磨砺:当你站在 ...
- 为什么叫python编程-月薪上万的Python编程,为什么你还没入门就放弃了?
"大家都是怎么学Python 的?我学了一个月,感觉自己怎么学都学不进去啊,还是一脸懵--学习前我有做过规划,现在连入门都不算,我应该怎么办啊!!!求大神给一个学习思路!求大神讲解入门要重点 ...
最新文章
- SIM300实现GPRS上网
- java redis设置过期时间_Redis的一些核心原理
- python九十八类_Python领域最伟大工程师Kenneth Reitz,教你写代码
- hdu4740 Sum
- C++Primer Plus (第六版)阅读笔记 + 源码分析【目录汇总】
- 数据结构与算法--1.整型变量值互换
- l2-029 特立独行的幸福 (25分)_霜降后盆栽幸福树,调整4个地方,不用再怕掉叶子了...
- bzoj1336[Balkan2002]Alien最小圆覆盖
- 剑指Offer:打印从1到最大的n位数
- mysql主从错误1007_mysql主从错误:1032
- @cacheable 服务器 不一致_Dubbo一致性哈希负载均衡的源码和Bug,了解一下?
- 网络通信词汇——MCC、MNC、dbm、TAC、ECI、PCI、BAND、EARFCN、FREQ、RSSI、RSRP、RSRQ、SINR
- 少有人走的路---心智成熟的旅程
- android 左右分栏联动布局,自定义页面分栏布局
- TZOJ 数据结构实验:一元多项式相加
- 爱奇艺,美团打车Java岗面试经历,这些问题我是真没抗住
- Cameralink转VGA接口转换器
- 鸥玛软件在深交所创业板挂牌上市,系山东大学间接控股企业
- flask获取参数类型和请求响应
- Autofac程序集注入