本文适用读者:已经熟练掌握Android编程,并且用过butterknife的程序员。最好是看了很多其他dagger2文章还没有学会的人。
dagger2,是什么?依赖注入框架。什么是依赖注入?咱说人话,依赖,就是需要某个东西,没有它不行。注入,把一个东西送到另一个东西里面。依赖注入啥意思?就是把需要东西送到某个地方。比如,你要写钢笔字,钢笔没水了。你需要墨水,把墨水注入到钢笔里。加墨水这个动作,就是依赖注入。在咱android上就是,你在某个Activity里面需要某个类,通过dagger2把这个类送到这个Activity里,你可以在这个Activity里使用这个类。
下面讲dagger2,打开android studio。创建一个新project。在build gradle里粘贴下面的代码,然后synk
compile'com.google.dagger:dagger:2.16'
annotationProcessor'com.google.dagger:dagger-compiler:2.16'
既然是包教包会,我们就以包子为例。
先建一个包子类,韭菜包子。
import javax.inject.Inject;
public class Baozi {
String type = "韭菜";
@Inject
public Baozi() {
}
}
和以前不一样的地方是有个“@Inject”,这是个注解,就是说,我们要送的东西,就是包子这个类。大家用过butterKinfe黄油刀吧?和butterknife那个@bind或者@bindview 很像。
MainActivity,相当于办公室,使用(食用)包子的一个场景。
我写了个按钮,点一下,能吃包子,知道什么馅的。
public class MainActivity extends AppCompatActivity {
Button btnEat;
@Inject
Baozi baozi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定
btnEat = findViewById(R.id.eat);
//点击事件
btnEat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, baozi.type, Toast.LENGTH_SHORT).show();
}
});
}
}
包子有了,Activity是咱的办公室。现在要把包子送到办公室里。或者说把Baozi类注入到MainActivity里。点了包子外卖,由送餐员送到办公室。在dagger2里,谁是送餐员呢?他的名字叫“朱建”,英文名Component。中文意思是组件。我也不知道为什么叫component这个怪名字。记住中文名叫“朱建(组件)”,英文名叫component就好了。
创建组件,送餐员,类名是MainComponent ,要注意的是这个是个接口interface,不是类class。
import dagger.Component;
@Component()
public interface MainComponent {
void inject(MainActivity activity);
}
函数inject,代表要注入,也就是送餐。送到什么地方呢?写到函数参数里(MainActivity activity)。
接下来按ctrl + F9,也就是build菜单下make project, Dagger2通过编译器会在某些文件夹下生成一些类。这个类就是我们的送餐员,它把我们需要的类(包子)送到需要的地方-办公室(MainActivity)。这个类的名字是Dagger+MainComponent ,DaggerMainComponent
命名方式推荐为: 目标类名+Component ,在编译后Dagger2就会为我们生成 DaggerXXXComponent 这个类
注入代码是
DaggerMainComponent.builder().build().inject(this);
在MainActivity里写上上面这句一运行,包子就送到办公室,Baozi就注入到了MainActivity里面。好奇怪,这个类竟然不用import,请高手指点为什么。
点击“吃”按钮,toast显示“韭菜”。我们知道什么馅的了。哈哈。
这样,dagger2最简单的使用方法你已经会了。
最终代码如下:
public class MainActivity extends AppCompatActivity {
Button btnEat;
@Inject
Baozi baozi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnEat = findViewById(R.id.eat);
DaggerMainComponent
.builder()
.build()
.inject(this);
btnEat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, baozi.type, Toast.LENGTH_SHORT).show();
}
});
}
}
复习一下使用步骤
1.创建要注入的类,构造方法要加@inject
2.在你需要的地方(比如Activity里面),声明这个类时,也要加@inject
3.创建component,声明inject方法,参数是你需要用这个类的地方,比如某个Activity。不要忘了@Component()
4.按Ctrl + F9,或者build菜单下make project,生成daggerXXXComponent类。
5.在Activity里写
DaggerXXXComponent
.builder()
.build()
.inject(this);
这样你就可以使用注入的类了。
包教包会,现在dagger2最简单的用法你会不会了?不会的话,请留言,我改进文章,到能看会为止。
再说一下dagger2 的优点。为什么用dagger2?直接在Activity里面new 一个类就行了。也就是说,为啥要送餐员?直接在办公室做包子就行了。问题是,Activity可能有很多。万一这个类的构造方法发生改变,就要在每一个Activity里面重写构造方法。如果包子要改成猪肉馅的,要在每个办公室里改包子。重复很多遍。如果用dagger2,只要在要注入的类里面改就好了。只需要改一遍。
下一篇介绍dagger2更多的用法。
https://www.jianshu.com/p/807fd29283f4