和很多自主学习的人不一样,我接触Dagger 2 框架的原因是刚进公司的时候导师给安排的学习任务,学习方式是组内培训。 听到这个消息的我,以为是部门的人轮流给我讲课。 后来导师跟我说,组内培训的意思是,我先自己好好学这个框架,然后给组内的所有人搞个培训。 没办法,在网上看了很多相关博客,浪费了不少时间,终于还是学有所得,也记录一下我最近的学习进展。 就不多讲什么历史了,你能看到我这篇博客,想来历史什么的科普你都已经被塞到吐了,还是撸代码学得快。 一 环境配置 在module的build.gradle中添加代码: 复制代码 dependencies { ...... //dagger2 implementation 'com.google.dagger:dagger:2.7' annotationProcessor 'com.google.dagger:dagger-compiler:2.7' //butterknife implementation 'com.jakewharton:butterknife:10.0.0' annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0' } 复制代码 为了后面书写代码简便,将ButterKnife一起配置了。 在Project build.gradle中添加如下代码(这段代码是配置ButterKnife使用的,不配置可能就会报TimeOut的错误): 复制代码 allprojects { repositories { google() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } jcenter() } } 复制代码 到这里配置就完成了,ButterKnife可以为我们省下很多代码,因为ButterKnife和Dagger的厂家是一样的,很多地方也是共通的,就不多解释原理,拿来就用。 二 源码分析 我们先创建一个简单的Tools类: 复制代码 public class Tools { @Inject public Tools(){} } 复制代码 不需要任何属性,只用@Inject标记一个空的构造方法,然后我们使用Ctrl+F9进行编译。 Dagger2 是通过标记来公式化编写代码,减轻我们重复编写代码的劳动。 这里提到个词“公式化”,其实很好理解。 比如,你要给你给你喜欢的女孩子表白,先跟你寝室兄弟们排练一百遍表白流程。到了女寝楼下,你清一清嗓子,就有人给你打好了灯光,你叫完女孩的名字,身后就有人放飞了粉红的爱心气球,你刚说完那羞羞的三个字,周围就全是大声呼喊“答应他、答应他......” 女孩十分感动,然后拒绝了你...... 咳咳,讲偏了! 总之,公式化的东西就是这样,固定好的流程,你只需要打个特殊的手势,别人就知道该怎么做。为什么?因为流程都是公式化的,固定的,已经跑过千百次了,大家闭着眼睛都能敲出来。在程序里也是这样,不要重复造轮子。你只需要打个标记,就像上面提到的@Inject,剩下的繁琐的任务交给喜欢重复劳动的计算机。 那么,看到@Inject这个标记,计算机又做了什么呢? 编译过后会发现build中多了一个文件(你要问我路径在哪?后面我带你找,听我的,慢慢来!),叫做Tools_Factory类,内容如下: 复制代码 public enum Tools_Factory implements Factory { INSTANCE; @Override public Tools get() { return new Tools(); } public static Factory create() { return INSTANCE; } } 复制代码 这就是AS自动生成的代码。一个工厂类,类如其名,就是个工厂。通过create()方法进行创建,通过get()方法获得new Tools对象。 下面我就贴四大基本组件的代码了,先把框架搭起来: 首先是MainActicity: 复制代码 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this);//ButterKnife绑定Activity } @OnClick({R.id.turn_firstactivity}) public void onViewClicked(View view) { switch (view.getId()){ case R.id.turn_firstactivity: startActivity(new Intent(this, FirstActivity.class)); break; } } } 复制代码 就简简单单一个跳转,跳转到我们接下来要使用的FirstActivity中。 贴一下activity_main这个layout,平时我看博客最讨厌别人不把代码贴完,我当然不会犯这个错。 复制代码