dagger2从入门到放弃-概念

前言

dagger2貌似从两年前开始在各大android论坛刷屏,一堆Retrofit+RxJava+Dagger2项目如雨后春笋一样冒了出来。不过当时并没有赶这个潮流,主要是因为手头上项目已经较为庞大,而引入dagger2这种入门门槛比较高的库到项目里收益并不好估计,当然更明显的原因就是懒咯。

那现在为啥要用dagger2呢?因为新公司有一套插件框架,在插件中引入dagger2的成本相对小了不少,可以实验性的去尝试下,但是最终还是决定不在项目中引入dagger2,原因最后一篇文章会说到。

什么是dagger2

关于dagger2的来龙去脉网上的文章说的足够多了,也就不多说了,只提下我觉得重要的几点

  • 编译期的依赖注入框架
  • 使用代码生成而不用反射

以上两点决定了dagger2的注入只限于编译期可以确定的静态注入,像View,Activity这种运行时产生,且实例是由android框架创建出来的对象只能作为被注入的组件,而无法做为依赖注入到其他地方。当然有舍有得

  • dagger2拥有更强的运行时性能
  • 较为完善的编译期代码检查
  • 因为在编译期就生成了全部代码,所以调试也没什么问题,不过个人觉得生成的代码不够直观,调试起来还是很麻烦

依赖注入框架解决的问题

先说说我理解的依赖

依赖是指某个模块A要实现某个功能需要其他模块B。

最原始也最简单的的方式是在模块内new一个B的对象出来,这样会造成B的构造函数修改,需要修改A中的代码,两者耦合度非常高。

依赖注入

依赖注入是不在A中去创建 B的实例,而是让上层调用者注入一个B的对象,这样可以让模块A不再因为B的构造方法的修改而改变

注意一点,依赖注入只让A摆脱了和B的构造函数的耦合,至于A中对B的依赖基于一个实现还是一个接口,依赖注入是管不着的(依赖注入和面向接口编程都是为了模块间解耦但是没有直接的关系)

如果A依赖于一个接口,而这个接口的实现B又是从外部传入的,这样可以让A完全独立于B而存在,复用起来就更为简单

依赖注入带来的问题

所有的下层模块将创建依赖的任务都往上抛,那么必然会导致最上层的模块需要创建所有必须的依赖,而到依赖的传递过程也会多很多setter或者增加很多构造参数

//网上找的一个比较合适的例子
public class LoginActivity extends AppCompatActivity {

    LoginActivityPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        OkHttpClient okHttpClient = new OkHttpClient();
        RestAdapter.Builder builder = new RestAdapter.Builder();
        builder.setClient(new OkClient(okHttpClient));
        RestAdapter restAdapter = builder.build();
        ApiService apiService = restAdapter.create(ApiService.class);
        UserManager userManager = UserManager.getInstance(apiService);
        
        UserDataStore userDataStore = UserDataStore.getInstance(
                getSharedPreferences("prefs", MODE_PRIVATE)
        );

        //Activity只需要依赖LoginActivityPresenter
        //但因为使用了依赖注入,让下层模块相互解耦,导致activity需要承担所有依赖的创建任务
        //也就多了上面那么多代码
        presenter = new LoginActivityPresenter(this, userManager, userDataStore);
    }
}

依赖注入框架的意义

依赖注入框架的目的就在于承担了最上层创建依赖的职责,并且利用注解在合适的地方注入依赖,简化依赖的创建和传递的模板代码

public class LoginActivity extends AppCompatActivity {

    @Inject
    LoginActivityPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //Satisfy all dependencies requested by @Inject annotation
        getDependenciesGraph().inject(this);
    }
}

当然简化掉的代码没那么夸张,创建依赖的方法只不过是从activity中移到了依赖注入框架中,而依赖注入框架和业务代码之间是没有耦合的,可以按照一定的规则进行复用

dagger2的基本概念

injection.jpg

依赖的提供方

dagger2中有两种提供依赖的方式

  • 使用@Inject注解构造器的类
    • 使用在自己可以修改源码的类中
  • 使用@Module注解包含提供依赖方法的类,使用@Provide方法主角提供依赖的方法
    • 用在提供没有修改源码权限的类的依赖

依赖的需求方

其实也可以分为两类

  • 正常的类,使用了@Inject注解了成员变量的类
    • 这里注入依赖需要自己触发
  • @Inject注解构造器的类
    • 这里@Inject注解的成员变量和构造器参数都会去框架中去找,这个过程是编译时自动完成的
    • 这些类既是依赖的需求方也是依赖的提供方

依赖注入器

使用@Component或者@SubComponent注解的接口或者抽象类

  • 描述可以提供哪些依赖
  • 描述可以注入到哪些依赖需求方
  • 管理依赖的生命周期

也许看完上面一堆你还是一头雾水,那么后面就通过代码循序渐进来熟悉dagger2吧

相关文章

dagger2从入门到放弃-概念
dagger2从入门到放弃-最基础的用法介绍
dagger2从入门到放弃-Component的继承体系、局部单例
dagger2从入门到放弃-ActivityMultibindings
dagger2从入门到放弃-dagger.android
dagger2从入门到放弃-其他用法
dagger2从入门到放弃-多模块项目下dagger的使用
dagger2从入门到放弃-为何放弃

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