[包教包会]dagger2使用教程(一)最基本的用法

本文适用读者:已经熟练掌握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,相当于办公室,使用(食用)包子的一个场景。

我写了个按钮,点一下,能吃包子,知道什么馅的。


image.png
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最简单的使用方法你已经会了。

image.png

最终代码如下:

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更多的用法。
//www.greatytc.com/p/807fd29283f4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容