“好久不见的Dagger2和Dagger-Android”(一)

一、前言

Dagger出来也不久时间了,据说也是较为难理解的框架之一。目前已经出来Dagger2了。最近在项目刚好准备重构mvp模式,但是mvp模式会带来大类的接口,而且也间接说明要大量实例化接口层对象。如果引用dagger模板化变成,无疑能够提高我们开发的效率。

熟悉spring框架的人肯定很熟悉aop编程,其实现在大量框架也引用了这种思想,例如rxjava、arouter等等。第一篇我先简单介绍Dagger2的具体用法(其实不难理解,有时间的读者可以尝试阅读编译生成的代码,看看他们是如何关联起来的),另一篇则介绍下Dagger2的android扩展库Dagger2-android与mvp模式如何结合起来。

二、Dagger2用法

(0) Dagger2引入指南

1.首先在你的library module引入(2.11版本举例)

    compile 'com.google.dagger:dagger:2.11'

2.其次在你需要用的applicationo module引入compiler组件

    annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
(1)简单入手

1.创建一个带注入的实体

public class Demo {

    @Inject
    public Demo() {
     // 构造方法默认注解,并且无参数...
    }

    public void action(){
        Log.e("SIVEN","demo action");
    }
}

2.创建一个注入器,绑定对应的activity

@Component
public interface MainActivityComponent {
    void inject(MainActivity mainActivity);
}

3、在对应的activit引入注解器并注解Demo类

     @Inject
    Demo demo;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        DaggerMainActivityComponent.create().inject(this);
        super.onCreate(savedInstanceState);
        //...
        demo.action(); // 执行注入对象方法
    }

或者

1.创建一个实体

public class Demo {
    public Demo() {
     // 构造方法默认注解,并且无参数...
    }

    public void action(){
        Log.e("SIVEN","demo action");
    }
}

2.创建一个注入器,绑定对应的activity

@Component
public interface MainActivityComponent {
    void inject(MainActivity mainActivity);
}

3.创建一个module工厂,并且绑定指定注入器

@Module(components = MainActivityComponent.class)
public abstract class MainActivityModule {
        @Provides
        Demo provideDemo(){
        return new Demo();
    }
}

4、验证

     @Inject
    Demo demo;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        DaggerMainActivityComponent.create().inject(this);
        super.onCreate(savedInstanceState);
        //...
        demo.action(); // 执行注入对象方法
    }
(2)既爱又恨的component与module

首先解释下这两个专属名词代表什么意思。

  • component
    可以理解成注解器,即将注解对象与注解目标关联起来的作用。注解对象例如我要在activity使用注解、或者在fragment使用注解;注解目标即我在activity或fragment中要注解那个实例,例如案例的Test实体。标准写法如下:
@Component
public interface MainActivityComponent {
    void inject(MainActivity mainActivity); // 注解对象,具体注解在哪个activity
}
  • module
    可以理解提供对象实例的工厂类,可有可无(待会解释)。module提供很多注解方式,例如Singleton(单例)、Scope(局部单例)等。其中module的标准写法为如下:
@Module(components = 目标注解器.class)
public abstract class MainActivityModule {
        @Provides // 必须有provides操作符
        Demo provideDemo(){ // 命名规则provide+目标类名
        return new Demo();
    }
}
(3)如何理解module可有可无?

首先我们看下什么时候是可以不用module的。在上面的案例中,我们定义了Demo这个model,并且在其构造方法中加上@Inject注解,如下:

    @Inject
    public Demo() {
     // 构造方法默认注解,并且无参数...
    }

其次不需要定义module,只要在注解对象(MainActivity)中关联注解器component,使用@Inject注解符号即可注解实例Demo对象,例如如下:

   @Inject
    Demo demo;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        DaggerMainActivityComponent.create().inject(this);
        super.onCreate(savedInstanceState);
        //...
        demo.action(); // 执行注入对象方法
    }

这里有没有人有什么疑问?为啥简单在构造器标记 @Inject就可以实现注解,为什么还要搞一个module这么复杂?的确,自己创建的类我们可以在构造方法里面申明。好了,第三方的类都封装在jar,那我们怎么去他的构造方法申明?所以,module就是为这个而存在的。

module,类似设计模式的类工程设计思想。通过创建module的时候申明component可以指定与哪个注解器相关联。所以在注解对象中,所有的注解实例都会通过module提供的provide工厂方法进行实例化。这也是module设计的巧妙之处。具体读者可以参考上面的案例。

四、总结

虽然以前有接触过spring,像aop这种设计思想进来终于向移动客户端靠齐了。尽管注解这种东西比较难理解与消化,真的要了解注解、预编译这种,非常强烈建议去阅读注解后预编译生成的文件究竟是这么关联操作的。笔者也是了解了三四天才差不多明白啊~

下一篇讲下Dagger2的扩展库Dagger-Android,基于android的扩展库,能很好配合mvp模式喔~

感谢阅读 18.01.29

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

推荐阅读更多精彩内容